Node.js 快速身份验证-发送后无法发送标头
我创建了一个函数,通过验证存储的会话用户/过程是否与数据库中的内容匹配来限制路由访问Node.js 快速身份验证-发送后无法发送标头,node.js,express,Node.js,Express,我创建了一个函数,通过验证存储的会话用户/过程是否与数据库中的内容匹配来限制路由访问 var checkAuth = function(req, res, next){ if(typeof(req.session.user) === 'undefined') { req.session.user = { name: '', pass: '', loggedIn: false } } $R.user.validateLogin(req.session.user, functio
var checkAuth = function(req, res, next){
if(typeof(req.session.user) === 'undefined') {
req.session.user = { name: '', pass: '', loggedIn: false }
}
$R.user.validateLogin(req.session.user, function(err){
if(err) res.redirect('/login')
else {
req.session.user.loggedIn = true
next()
}
})
}
app.get('/restricted', checkAuth, function(req, response){
response.render('index')
})
它似乎工作得很好,因为如果没有发现某人,它将重定向到/login页面,但在重定向后,应用程序立即因错误而关闭
错误:发送邮件后无法设置邮件头
我已将错误追溯到res.redirect('/login'),但不知道如何纠正我的错误
编辑:我的登录路径处理程序
app.get('/login', function(req, response){
$R.page.addStyles(['forms','user/user'])
response.render('user/login')
})
app.post('/login', function(req, response){
$R.user.validateLogin(req.body, function(err, res){
if(err) response.end(JSON.stringify({error: err.message}))
else {
req.session.user = req.body
response.end(JSON.stringify({ok: true}))
}
})
})
您的问题是函数:
$R.user.validateLogin(req.session.user, function(err){
这是一个时代。checkAuth
函数应立即返回真/假或重定向。当前登录的流程如下所示:
var checkAuth = function(req, res, next){
if(typeof(req.session.user) === 'undefined') {
req.session.user = { name: '', pass: '', loggedIn: false }
}
if (!req.session.user.loggedIn) {
// req.session.user.loggedIn = true should be set in the 'login' route, in $R.user.validateLogin
res.redirect('/login');
} else {
// if we already have a req.session.user and they are logged in, keep going
next();
}
}
var checkAuth = function(req, res, next){
if(typeof(req.session.user) === 'undefined') {
req.session.user = { name: '', pass: '', loggedIn: false }
}
if (!req.session.user.loggedIn) {
// req.session.user.loggedIn = true should be set in the 'login' route, in $R.user.validateLogin
res.redirect('/login');
} else {
// if we already have a req.session.user and they are logged in, keep going
next();
}
}
很抱歉出现任何语法错误,我没有测试上述代码。我认为错误不在您显示的代码中,但在路由“/login”的处理程序中,在$R.page.addStyles中,您似乎在向响应写入内容。这将在尝试响应时导致错误。render('user/login')。如果在.render()之前res.write()、.end()、.send()或.json(),这就是您要查找的内容。只有在从checkAuth()重定向后,我才会收到错误。addStyles仅将文件路径添加到模块数组以包括在布局中,如果我在url中输入/登录,则可以正常工作。错误是res.redirect(/login),根据假定的堆栈outputI,因为存在next()回调表明路由中间件也是异步的,仅在调用next()后才继续。你的解决方案奏效了,thanx!