我正在使用 Node JS 和 Express JS 构建 REST API。
我有一个具有以下功能的 authService.js 文件。
const verifyVerificationToken = async ({ email, token }) => {
try {
let user = await userService.findUserByEmail(email).data
if (! user) {
return {
error: true,
code: 400,
message: "Invalid account."
}
}
let tokenModel = await VerificationToken.findOne({
where: {
userId: {
[Op.eq]: user.id
},
verificationToken: {
[Op.eq]: token
}
}
})
if (! tokenModel) {
return {
error: true,
code: 400,
message: "Invalid token."
}
}
// check if the token is expired
let now = new Date();
if (now.getTime() < tokenModel.expiresAt.getTime()) {
// check if the token is already verified
if (tokenModel.verifiedAt) {
// already verified
return {
error: true,
message: "Token has already been used",
code: 400
}
}
// update the verifiedAt column
await VerificationToken.update({
verifiedAt: now
}, {
where: {
id: {
[Op.eq]: tokenModel.id
}
}
})
return {
error: false
}
} else {
// token is expired
return {
error: true,
code: 400,
message: "Token been expired."
}
}
} catch (e) {
return {
error: true,
code: 500,
message: e.message
}
}
}
如您所见,它正在调用 userService.js 文件的 findUserByEmail 函数。下面是findUserByEmail函数的实现。
const findUserByEmail = async (email) => {
try {
let user = await User.findOne({
where: {
email: {
[Op.eq]: email
}
}
})
if (user) {
return {
error: false,
data: user
}
} else {
return {
error: true,
data: null,
message: "User not found",
code: 404
}
}
} catch (e) {
return {
error: true,
message: e.message,
code: 500
}
}
}
当我运行代码时,它从不返回用户,而是在控制台中,我收到以下错误。
(node:7600) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:467:11)
at ServerResponse.header (C:\Users\Acer\Desktop\collect_api\node_modules\express\lib\response.js:771:10)
at ServerResponse.send (C:\Users\Acer\Desktop\collect_api\node_modules\express\lib\response.js:170:12)
at ServerResponse.json (C:\Users\Acer\Desktop\collect_api\node_modules\express\lib\response.js:267:15)
at login (C:\Users\Acer\Desktop\collect_api\controllers\authController.js:38:19)
at processTicksAndRejections (internal/process/task_queues.js:88:5)
我的代码有什么问题,我该如何修复?
答案 0 :(得分:1)
至于错误“从不返回用户”,您应该更改:
let user = await userService.findUserByEmail(email).data
到:
let user = (await userService.findUserByEmail(email)).data
答案 1 :(得分:0)
该错误意味着您至少向客户端发送了两次数据。 如果您使用 express,则意味着您多次调用 res.send(或等效的 res.render)。
因此,您没有在问题中提供正确的代码示例,以便我提供更多帮助。