node.js - 一旦发送了错误的凭证,Express 服务器就会崩溃
问题描述
我正在尝试使用电子邮件和密码登录,但如果我使用正确的数据登录,那就没问题了。如果我输入错误的任何一个字段,那么它会显示预期的输出并立即崩溃,我必须从 npm start 重新启动服务器。如果我不重新启动服务器,之后将无法进行进一步的 API 调用。
用户路线:
// Login
router.post('/login', async (req, res) => {
try {
const user = await User.findOne({
email: req.body.email,
});
!user && res.status(401).json('email does not exist in the DB');
const bytes = CryptoJS.AES.decrypt(
user.password,
process.env.SECRET_KEY
);
const originalPassword = bytes.toString(CryptoJS.enc.Utf8);
originalPassword !== req.body.password &&
res.status(401).json('wrong password');
const accessToken = jwt.sign(
{
id: user._id,
},
process.env.SECRET_KEY,
{ expiresIn: '300000' }
);
const { password, ...info } = user._doc;
res.status(200).json({ ...info, accessToken });
} catch (err) {
res.status(500).json(err);
}
});
解决方案
res.json
当您打算提前退出函数时,请在调用中添加 return 语句。否则,您的其余代码将继续执行并引发错误,因为响应已发送。
您的代码抛出错误,因为您的响应被多次发送。然后,您的 catch 试图发送另一个响应,这会引发另一个错误。
推荐阅读
- javascript - 单击父项时如何获取子项ID?
- python - Tkinter Canvas create_window 定位问题
- java - Java:为什么这个 Equal-String 函数受到定时攻击的保护
- python - .exe 文件无法从通过 rtsp 连接的摄像机读取 VideoStream?
- google-cloud-platform - Dialogflow webhook 中的 ssml
- java - Java 8 如何在集合接口中有具体方法?
- mysql - MySQL左连接返回只返回一行
- python - mongoengine 在嵌套字段上获取值
- git - eclipse 中的 Commit 和 Push 将整个文件提交为已更改
- angular - 如何在Angular Component文件中引用像datepicker这样的jQuery函数?