node.js - 发出 POST 请求时出现 Nodejs 错误 [ERR_HTTP_HEADERS_SENT]
问题描述
我是 NODEJS / express 的新手,我正在按照教程构建一个小型 MERN 应用程序。在最初的步骤中,在设置 POST 路由时,当使用 Postman 发送 POST 请求时,我得到了这个我已经Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
阅读过的内容,我以某种方式理解是因为我res.json
在同一个响应中调用了两次。
我的路由器是这样的:
router.post('/login',
async (req, res) => {
try {
const user = await userModel.findOne({email:req.body.email});
!user && res.status(404).send("user not found");
const correctPassword = await bcrypt.compare(req.body.password, user.password);
!correctPassword && res.status(400).json('incorrect password')
res.status(200).json(user); // if not invalid return user
} catch (err) {
console.log(err)
}
})
我尝试了在这里找到的不同解决方案(IF & if Else 语句,使用return
...),但没有成功。这个相同的代码(具有不同的变量名)在提到的教程中运行完美。
知道我该如何解决吗?提前致谢。
编辑:我添加了我的用户路线的恢复'''
import express from 'express';
const router = express.Router();
import bcrypt from 'bcrypt';
import userModel from '../models/userModel.js'
router.post('/register',
async (req, res) => {
try {
// hash password
const salt = await bcrypt.genSalt(10);
const hashedPassword = await bcrypt.hash(req.body.password, salt)
// Create New User
const newUser = new userModel({
userName: req.body.userName,
email: req.body.email,
password: hashedPassword,
});
// Save New User and return response
const user = await newUser.save();
res.status(200).json(user);
} catch(err){
console.log(err)
}
});
解决方案
可能用户是假的或正确密码评估为假,这将发送“找不到用户”或“密码错误”的响应。
但是,它会继续执行您的函数的其余部分并最终执行此行
res.status(200).json(user);
此行将导致您提到的错误,因为您之前已经向客户端发送了响应,并且无法在同一请求响应周期中发送另一个响应。
这应该可以解决问题:
router.post("/login", async (req, res) => {
try {
const user = await userModel.findOne({ email: req.body.email });
if (!user) {
return res.status(404).send("user not found");
}
const correctPassword = await bcrypt.compare(req.body.password, user.password);
if (!correctPassword) {
return res.status(400).json("incorrect password");
}
return res.status(200).json(user); // if not invalid return user
} catch (err) {
console.log(err);
return res.status(500).send(err.message);
}
});
我建议在这里使用 ifs,因为它使代码更易于阅读。我还建议您在发送回复时使用 return,因为它可以避免您遇到的问题。
推荐阅读
- c++ - 为什么我的重载“+”运算符返回错误的总金额?
- django - Django后台任务重复超过它应该
- angular - 订阅后无法使用\log 值
- reactjs - Firebase On Value 获取状态反应钩子
- json - 递归地将 JSON 切片为数据框列
- spring-boot - 如何在spring中创建注释
- html - “Background-size:” 不影响背景图片 HTML CSS Flask
- python-3.x - 有什么方法可以改革 ptyhon 的 list 和 dic 中的建设吗?
- python - 任意上报 MemoryError 和 OverflowError
- reactjs - 使用 React + Redux 设计 Websocket