Использование глобальной переменной для передачи данных между маршрутами / промежуточным ПО - очень плохая идея, потому что вы всегда должны предполагать, что два запроса одновременно попадают на ваш сервер, и тогда errorCode
будет перезаписанодин запрос, прежде чем он может быть использован другим запросом на рендеринг.Вы должны хранить переменные, зависящие от запроса / ответа / задачи, с соответствующим объектом.
И вы никогда не устанавливаете errorCode
на что-то другое, чем 0
.Потому что перед ним всегда есть оператор возврата, например:
return next(err); // the function is exit here before the next statement is executed
errCode = 1; // is never executed because this is unreachable code
Промежуточные программы выполняются в том порядке, в котором они присоединены, поэтому, если вы напишите:
router.use(function(req, res, next) {
// ...
})
router.post('/login', middleware.access, function(req, res, next) {
// ...
})
Тогда кодИспользование выполняется перед включением сообщения, поэтому, даже если errCode
установит ben, тогда res.locals.errCode = errCode
будет выполнено до того, как было установлено errCode
, и получит предыдущее значение errCode
.
Итак, ваш код должен выглядеть так:
router.post('/login', middleware.access, function(req, res, next) {
passport.authenticate('local', function(err, user) {
if (err) {
res.locals.errCode = 1;
return next(err);
}
if (!user) {
res.locals.errCode = 2;
// THIS WON'T WORK: because the `res.locals.errCode` will not
// survive the redirect you need to use sessions here or pass the
// error with the redirect
return res.redirect('/login');
}
req.logIn(user, function(err) {
if (err) {
res.locals.errCode = 1;
return next(err);
}
return res.redirect('/regiune/' + req.body.regiune);
});
})(req, res, next);
});