Обновление res.locals после каждого изменения var? - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь создавать свои собственные флеш-сообщения, но более простым способом.Это выглядит так:

var errCode = 0;

router.use(function(req, res, next)
{
    res.locals.errCode = errCode;
    next();
});

router.post('/login', middleware.access, function(req, res, next) {
    passport.authenticate('local', function(err, user) {
      if (err) { return next(err); errCode = 1;}
      if (!user) { return res.redirect('/login'); errCode = 2;}
      req.logIn(user, function(err) {
        if (err) { return next(err); errCode = 1;}
        return res.redirect('/regiune/' + req.body.regiune);
      });
    })(req, res, next);
  });

и в EJS

<% if(errCode === 1){ %>
        <span class="login-error">err1</span><br/>
        <% } %>
        <% if(errCode === 2){ %>
            <span class="login-error">err2</span><br/>
        <% } %>
        <% if(errCode === 3){ %>
            <span class="login-error">err3</span><br/>
        <% } %>      

Проблема с моей идеей состоит в том, что errCode передается со значением 0, потому что это значение, которое он имел в первую очередь.Есть ли способ обновить res.locals.errCode при каждом изменении errCode?

1 Ответ

0 голосов
/ 16 декабря 2018

Использование глобальной переменной для передачи данных между маршрутами / промежуточным ПО - очень плохая идея, потому что вы всегда должны предполагать, что два запроса одновременно попадают на ваш сервер, и тогда 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);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...