【发布时间】:2022-01-11 05:29:33
【问题描述】:
我在这里做错了什么? 我收到“错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端 NodeJS 后无法设置标头”,有人可以帮我吗?
我正在使用:
快递 猫鼬(用于 MongoDB)
控制器
export const postResetPasswordEmail: Controller = async (req: Request, res: Response, next: NextFunction): Promise<void> => {
const { email } = req.body
try {
const errors: IValidatorError = getValidationErrors(req)
if (Object.keys(errors).length !== 0) {
res.status(403).json({ errors })
return
}
const user = await User.findOne({ email })
if (!user) {
res.status(404).json({ message: AuthenticationErrors.noEmailFound })
return
} else {
if (!(user.passwordUpdatedAt === undefined || (new Date(user.passwordUpdatedAt) < new Date()))) {
res.status(404).json({ message: AuthenticationErrors.error10MinutesPassword })
return
}
}
const token = generateJWT({ email }, JWTKEY, '10m')
await sendResetPasswordMail(email, token, next)
res.status(200)
.json({ message: SuccessMessages.resetPassword })
} catch (err: any) {
catchError(err, next)
}
}
发送重置密码邮件
const sendResetPasswordMail: SendResetPasswordMail = async (userEmail: string, token: string, next: NextFunction): Promise<void> => {
try {
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: adminEmail.email,
pass: adminEmail.pass
}
})
const mailOptions = {
from: adminEmail.email,
to: userEmail,
subject: 'Reset password',
text: `Reset password: http://localhost:3000/resetPassword?token=${token}`
}
await transporter.sendMail(mailOptions)
} catch (err: any) {
catchError(err, next)
}
}
生成JWT
const generateJWT: GenerateJWT = (userInfo: IUserInfo, JWTKEY: string, expireTime: string): string =>
jwt.sign({ ...userInfo }, JWTKEY, { expiresIn: expireTime })
【问题讨论】:
-
你能告诉我怎么做吗?
-
哪个请求会出现该错误?请展示从请求开始到结束的所有代码,以便我们跟踪正在处理的请求的整个路径。
-
catchError()是做什么的? -
我从控制器收到此错误。在其他的末尾。 (行)
-
const catchError: CatchError = (error: any, next: NextFunction): void => { !error.statusCode ? error.statusCode = 500 : null next(error) }
标签: javascript node.js typescript rest web