我查看了此问题的先前答案,但我不明白为什么如果多个路径中有res.send()
,则会出现此错误。
我的代码是这样的(表达4.13):
var user ={
username: "some",
password: "a"
}
router.post('/login', authenticate, function (req, res) {
//if it passes the middleware, send back the user
var token = jwt.sign({
username: user.username
}, jwtSecret);
res.send({
token: token,
user: user
});
});
function authenticate(req, res, next) {
var body = req.body;
var username = body.username, password = body.password;
//if nothing is sent
if(!username || !password){
res.status(400).end('Must send a user and pass');
}
//if incorrect credentials are sent
if(username !== user.username || password !== user.password){
res.status(401).end("Incorrect credentials");
}
//if it reaches here, it means credentials are correct
next();
}
当我从前端发送任何内容时,我收到400错误消息,但我的服务器显示:
POST /apis/auth/login 401 0.841 ms - -
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:346:11)
at ServerResponse.header (/home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/response.js:718:10)
at ServerResponse.json (/home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/response.js:246:10)
at ServerResponse.send (/home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/response.js:151:21)
at /home/vivek/dev/qwiksplit/jsback/app.js:81:9
at Layer.handle_error (/home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/router/layer.js:71:5)
at trim_prefix (/home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/router/index.js:310:13)
at /home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/router/index.js:280:7
at Function.process_params (/home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/router/index.js:330:12)
at next (/home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/router/index.js:271:10)
我不确定在发送响应后如何设置标头。
答案 0 :(得分:4)
一定要回来!
return res.status(400).end('Must send a user and pass');
答案 1 :(得分:2)
在您的中间件功能中,您需要确保在您已发送回复后调用next()
<(例如,通过调用res.send()
,{ {1}}或类似的。)
最简单的解决方案是在您发送回复后立即从中间件返回:
res.end()
答案 2 :(得分:1)
您缺少一些退货声明。如果您不从函数status
返回,send
会在response
对象上多次调用,最后甚至会调用next
,所以即将推出的中间件也会对响应进行操作。
function authenticate(req, res, next) {
var body = req.body;
var username = body.username, password = body.password;
//if nothing is sent
if(!username || !password){
res.status(400).end('Must send a user and pass');
return;
}
//if incorrect credentials are sent
if(username !== user.username || password !== user.password){
res.status(401).end("Incorrect credentials");
return;
}
//if it reaches here, it means credentials are correct
next();
}
答案 3 :(得分:0)
请确保在此代码后添加return语句
res.status(400).end('Must send a user and pass');
可以是
return; or return res.status(400).end('Must send a user and pass');
只需在该行之后返回任何内容,基本上在此之后停止执行代码。