how to solve “error unhandledRejection - Error [ERR_HTTP_HEADERS_SENT] - Cannot set headers after they are sent to the client”
when you develop using next.js and node, then you often face this error
error unhandledRejection: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
what is that?
SOLUTION
this is often caused by multiple response in node server handler
this is an example
i didn’t return response like this
// /pages/api/movies.ts
import clientPromise from "../../lib/mongodb";
export default async (req: any, res: any) => {
try {
const client = await clientPromise;
const db = client.db("test");
const collection = db.collection("movies");
switch (req.method) {
case "POST":
await collection.insertOne(req.body.movie);
res.status(200).json("work");
case "GET":
collection.find({}).toArray((err, document) => {
if (err) {
res.status(400).json({ err });
}
res.status(200).json(document);
});
}
} catch (err) {
console.log("handler ERROR", err);
res.status(500).json("handle /api/movies ERROR");
}
};
then it occurs this error
error unhandledRejection: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
and when i deploy to vercel, if i call POST method, then it return 500 error page.
so this is solution
// pages/api/movies.ts
import clientPromise from "../../lib/mongodb";
export default async (req: any, res: any) => {
try {
const client = await clientPromise;
const db = client.db("test");
const collection = db.collection("movies");
switch (req.method) {
case "POST":
await collection.insertOne(req.body.movie);
return res.status(200).json("work");
case "GET":
collection.find({}).toArray((err, document) => {
if (err) {
return res.status(400).json({ err });
}
return res.status(200).json(document);
});
}
} catch (err) {
console.log("handler ERROR", err);
return res.status(500).json("handle /api/movies ERROR");
}
};
after applying this ‘return’ keyword, i didn’t get that error