Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 快速身份验证-发送后无法发送标头_Node.js_Express - Fatal编程技术网

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();
  }
}
  • app.get('/restricted')激发
  • checkAuth火灾
  • $R.user.validateLogin异步激发(
  • 此时,checkAuth将控制权返回给app.get(“/restricted”)
  • 执行response.render('index')
  • 执行$R.user.validateLogin中的代码,调用重定向
  • 问题是您无法控制是先执行5还是先执行6。最终,这两者都会执行,因为你没有阻止5的发生

    要解决这个问题,您的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();
      }
    }
    

    很抱歉出现任何语法错误,我没有测试上述代码。

    我认为错误不在您显示的代码中,但在路由“/login”的处理程序中,在$R.page.addStyles中,您似乎在向响应写入内容。这将在尝试响应时导致错误。render('user/login')。如果在.render()之前res.write()、.end()、.send()或.json(),这就是您要查找的内容。只有在从checkAuth()重定向后,我才会收到错误。addStyles仅将文件路径添加到模块数组以包括在布局中,如果我在url中输入/登录,则可以正常工作。错误是res.redirect(/login),根据假定的堆栈outputI,因为存在next()回调表明路由中间件也是异步的,仅在调用next()后才继续。你的解决方案奏效了,thanx!