我正在使用jsonwebtoken来验证用户身份。 我的计划是将标记保存在标题中,然后在发出任何请求之前获取标头值。是的,我确实在登录成功时保存了标题中的值,但它应该像其他任何应用程序一样重定向到其他页面。我尝试重定向或渲染其他页面并获得错误
发送后无法设置标头。
apiRoutes.post('/authenticate', function(req, res) {
User.findOne({
name: req.body.name
}, function(err, user) {
if (err) throw err;
if (!user) {
res.json({ success: false, message: 'Authentication failed. User not found.' });
} else if (user) {
if (user.password != req.body.password) {
res.json({ success: false, message: 'Authentication failed. Wrong password.' });
} else {
var token = jwt.sign(user, app.get('superSecret'), {
expiresInMinutes: 60 // expires in 4 hours
});
var body = "hello world";
res.writeHead(200, {
"Content-Length": body.length,
"Content-Type": "text/plain",
"x-access-token":token
});
res.end();
console.log('token saved '+res.getHeader('x-access-token'));
}
}
});
});
这是完整的项目project
答案 0 :(得分:1)
这没有意义。 http响应只有一个状态代码。它是您的JSON数据,具有200状态或302状态并且设置了Location头。它根本不可能两者兼而有之。选一个。
如果需要,可以在JSON响应中放置一个位置以重定向,并让客户端在处理JSON响应后手动转到该重定向位置。
如果需要,您可以在200响应中放置一个位置标题,但浏览器不会自动遵循该标题。
此外,如果此请求是来自浏览器的Ajax调用,则浏览器不会因为您发送重定向响应而更改页面。接收Ajax调用的代码必须更改页面本身。
此外,repo1/
/module1
/module2
/module3
repo2/
/module4
/module5
会立即发送响应,因此您无法在发送后发送更多内容。
答案 1 :(得分:0)
试试这个,它对我有用......
res.writeHead(200, {
"Content-Length": body.length,
"Content-Type": "text/plain",
"x-access-token":token,
"Location": "http://www.google.com"
})