首页 文章

错误:“发送后无法设置标头 . ”

提问于
浏览
0

我是nodejs及其路由系统的新手 . 我收到了“发送后无法设置 Headers ” . 仅在Heroku上的 生产环境 模式(它在本地工作正常) .

//登录=========================================

router.get('/', ifLoggedOut, function(req, res, next){
    res.render('login', { message: req.flash('message')});
});

router.post('/login', function(req, res, next){
    var username = req.body.username;
    var password = req.body.password;

    req.checkBody('username', 'Username field is required').notEmpty();
    req.checkBody('username', 'Password field is required').notEmpty();

    req.checkBody('password', 'Invalid Credintials').len(8, 20);
    req.checkBody('username', 'Invalid Credintials').len(4, 20);

    var errors = req.validationErrors();

    if(errors) {
    res.render('login.ejs', {errors: errors});
    } else {
        passport.authenticate('local-login', {
            successRedirect : '/list', // redirect to the secure list section
            failureRedirect : '/', // redirect back to the signup page if there is an error
            failureFlash : true // allow flash messages
        })(req, res, next);
    }
});

//功能=============================================== =

function ifLoggedIn(req, res, next) {

// if user is authenticated in the session, carry on 
    if (req.isAuthenticated()) {
        return next();
    }
  console.log("cannot found in session");
  res.redirect('/');

}

function ifLoggedOut(req, res, next){
    if(req.isAuthenticated()){
        res.redirect('/list');
    }
    return next();
}


app.use('/', router);
}

// Heroku的错误日志

2015-08-20T07:37:07.490091 00:00 app [web.1]:错误:发送后无法设置标头 . 2015-08-20T07:37:07.490096 00:00 app [web.1]:at ServerResponse.OutgoingMessage.setHeader(_http_outgoing.js:335:11)2015-08-20T07:37:07.490098 00:00 app [web . 1]:在ServerResponse.header(/app/node_modules/express/lib/response.js:718:10)2015-08-20T07:37:07.490099 00:00 app [web.1]:at ServerResponse.send(/ app / node_modules / express / lib / response.js:163:12)2015-08-20T07:37:07.490101 00:00 app [web.1]:at done(/app/node_modules/express/lib/response.js :957:10)2015-08-20T07:37:07.490103 00:00 app [web.1]:在View.exports.renderFile [作为引擎](/app/node_modules/ejs/lib/ejs.js:355: 10)2015-08-20T07:37:07.490105 00:00 app [web.1]:at View.render(/app/node_modules/express/lib/view.js:126:8)2015-08-20T07:37 :07.490106 00:00 app [web.1]:at tryRender(/app/node_modules/express/lib/application.js:639:10)2015-08-20T07:37:07.490108 00:00 app [web.1] :at EventEmitter.render(/app/node_modules/express/lib/application.js:591:3)2015-08-20T07:37:07.490109 00:00 app [web.1]:at ServerResponse.render(/ app /node_modules/express/lib/response.js:961:7)2015-08-20T07:37:07.490111 00:00 app [web.1]:at /app/routes/routes.js:7:7 2015-08 -20T07:37:07.490112 00:00 app [web.1]:在Layer.handle [as handle_request](/app/node_modules/express/lib/router/layer.js:95:5)2015-08-20T07: 37:07.490114 00:00 app [web.1]:at next(/app/node_modules/express/lib/router/route.js:131:13)2015-08-20T07:37:07.490115 00:00 app [web .1]:at ifLoggedOut(/app/routes/routes.js:181:10)2015-08-20T07:37:07.490117 00:00 app [web.1]:在Layer.handle [as handle_request](/ app /node_modules/express/lib/router/layer.js:95:5)2015-08-20T07:37:07.490118 00:00 app [web.1]:at next(/ app / node_modules / express / lib / router / route.js:131:13)2015-08-20T07:37:07.490119 00:00 app [web.1]:at Route.dispatch(/app/node_modules/express/lib/router/route.js:112:3 )

1 回答

  • 2

    此问题出现在 ifLoggedInifLoggedOut 函数中,其中 next() 回调被调用,然后 redirect() 进行两次后续渲染调用 . 通过将 returnnext() 回调一起使用,可以避免这些错误 .

    原始代码:

    function ifLoggedOut(req, res, next){
        if(req.isAuthenticated()){
            res.redirect('/list');
        }
        return next();
    }
    

    固定版本:

    function ifLoggedOut(req, res, next){
            if(req.isAuthenticated()){
                return res.redirect('/list');
            } 
            return next();
        }
    

    或者 if else 可以正确使用(不需要 return ):

    if(req.isAuthenticated()){
        res.redirect('/list');
    } else {
        next();
    }
    

    尽管如此,使用 return 是避免这些错误的好习惯 .

相关问题