每当我第二次使用此URL时,我总是得到
无法设置已发送的标头
app.post('/auth/facebook', function(req, res, next) {
// What should I do with the access token?
User.findOne({ facebook: req.body.facebookId}, function(err, user) {
// if user does exist then simply send the token back to the client
if (user) {
return res.send({ token: createJWT(user) })
}
// if user doesnt exist
var user = new User();
user.email = req.body.email;
user.facebook = req.body.facebookId;
user.first_name = req.body.first_name;
user.last_name = req.body.last_name;
user.save(function(err) {
return res.send({ token: createJWT(user)})
});
});
});
是因为我发送了两次令牌吗?
答案 0 :(得分:0)
是的,发生此错误是因为您使用res.send设置响应标头两次。第一次设置它们时,即使它在if括号内,也是正常使用场景(大多数时候你会有一个用户返回)所以,第二次你调用它(这总是被执行),你已经设置它们(当用户存在时 - 大部分时间)。
我认为这与任何响应标头一起发生,例如KibGzr建议的res.json
。这是一般性建议。关于你的问题,我会把没有用户的场景括起来,在里面我会执行创建新用户的逻辑。然后在括号外面,我会设置标题,因为我总是想要发送标记。像这样:
app.post('/auth/facebook', function(req, res, next) {
// What should I do with the access token?
User.findOne({ facebook: req.body.facebookId}, function(err, user) {
// if user doesnt exist create one
if (!user) {
var user = new User();
user.email = req.body.email;
user.facebook = req.body.facebookId;
user.first_name = req.body.first_name;
user.last_name = req.body.last_name;
user.save(function(err) {
if(err){
console.log(err);
}
});
//Then send the token as a user exists anyway
return res.send({ token: createJWT(user) });
}
});
所以一般的想法是,每个方案设置标题一次 - 确保每个方案没有设置两次响应。希望我帮忙。
答案 1 :(得分:0)
用户对象可以是null或user.Put if else
块内的逻辑可以更容易地读取代码。在处理身份验证和注册时,始终控制台记录用户对象和req.body逻辑。让你的生活更轻松。
app.post('/auth/facebook', function (req, res, next) {
// What should I do with the access token?
User.findOne({facebook: req.body.facebookId}, function (err, user) {
// if user does exist then simply send the token back to the client
console.log(user);
if (user != null) {
return res.send({token: createJWT(user)})
} else {
// if user doesnt exist
var user = new User();
user.email = req.body.email;
user.facebook = req.body.facebookId;
user.first_name = req.body.first_name;
user.last_name = req.body.last_name;
user.save(function (err) {
return res.send({token: createJWT(user)})
});
}
});