Levi Mason
03/16/2022, 1:39 AMError: Unauthorized
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at new NodeError (node:internal/errors:371:5)
at ServerResponse.setHeader (node:_http_outgoing:576:11)
at NodeNextResponse.setHeader (/Users/levimason/Developer/Projects/task-app/node_modules/next/dist/server/base-http/node.js:56:19)
at DevServer.renderError (/Users/levimason/Developer/Projects/task-app/node_modules/next/dist/server/base-server.js:1134:17)
at DevServer.renderError (/Users/levimason/Developer/Projects/task-app/node_modules/next/dist/server/next-server.js:493:22)
at DevServer.run (/Users/levimason/Developer/Projects/task-app/node_modules/next/dist/server/dev/next-dev-server.js:452:35)
at async DevServer.handleRequest (/Users/levimason/Developer/Projects/task-app/node_modules/next/dist/server/base-server.js:307:20) {
code: 'ERR_HTTP_HEADERS_SENT'
The update shows after I refresh the page. I was wondering if anyone has ran into this issue, or has any suggestion on how to resolve the error?Andrew Ross
03/16/2022, 2:40 AMLevi Mason
03/16/2022, 2:45 AMimport { requireAuth } from "@clerk/nextjs/api";
import { getTaskById, updateTask, deleteTask } from "../../../models";
import { getUserEmail } from "../../../helpers/getUserEmail";
async function handler(req, res) {
const taskId = req.query.id;
/** Get users email from the Clerk cookie **/
const primaryEmail = await getUserEmail(req.session.userId);
/** Check if the persisted task email matches the requesters **/
const task = await getTaskById(taskId);
if (primaryEmail !== task?.userEmail) {
/** If it doesn't match, user will get a 401 **/
res.status(401).end();
}
switch (req.method) {
case "PUT":
const modifiedTask = req.body;
const updatedTask = await updateTask(taskId, modifiedTask);
res.status(200).json(updatedTask);
break;
case "GET":
res.status(200).json(task);
break;
case "DELETE":
await deleteTask(taskId);
res.status(200).json({ completed: true });
break;
default:
res.status(405).end();
break;
}
}
export default requireAuth(handler);
and this is my updateTask hook:
const updateTask = async function (taskId, task) {
try {
const response = await fetch(`/api/tasks/${taskId}`, {
method: "PUT",
body: JSON.stringify(task),
headers: {
"Content-Type": "application/json",
},
});
if (!response.ok) {
throw Error(response.statusText);
}
const [updatedTask] = await response.json();
/** Find the changed task and replace it. */
const updatedTaskIndex = task.findIndex(
(task) => task.id === updatedTask.id
);
task.splice(updatedTaskIndex, 1, updatedTask);
setTasks([...tasks]);
} catch (err) {
throw err;
Andrew Ross
03/16/2022, 5:52 AMgetTaskById
call, can you paste that as well please? hard to say for sure with only a glimpse, if you could reproduce it in a repo (barebones, just what you're experiencing the error from) I would definitely pull it and give it a whirl
also I am signed in with two different accounts to this channel (one on mobile other on laptop)...interestingLevi Mason
03/16/2022, 7:41 AMgetTaskById
call in the meantime:
export async function getTaskById(taskId) {
return await prisma.task.findFirst({
where: { id: taskId },
});
}
Levi Mason
03/20/2022, 3:13 AM/** Get users email from the Clerk cookie **/
const primaryEmail = await getUserEmail(req.session.userId);
/** Check if the persisted task email matches the requesters **/
const task = await getTaskById(taskId);
if (primaryEmail !== task?.userEmail) {
/** If it doesn't match, user will get a 401 **/
res.status(401).end();
}
Now I'm on to solve TypeError: Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.
During the same update action.
I'm sorry for the late response.Andrew Ross
03/20/2022, 5:13 AMLevi Mason
03/23/2022, 1:32 AM