Подтвердить что ты не робот

Миграция Express.js с 2 по 3, в частности app.dynamicHelpers() в app.locals.use?

Обновлен Express.js с версии 2 по 3, и следующий вызов app.dynamicHelpers({..}) сломался, поскольку он больше не присутствует в V3:

app.dynamicHelpers({

    request: function(req){
      return req
    },
    ...etc.
});

Там руководство по миграции, в котором говорится следующее:

  • app.dynamicHelpers() (используйте промежуточное ПО + res.locals)

Но я в тупике, как это сделать. Есть ли более конкретный пример того, как перенести это?

Связанная публикация SO: nodejs express 3.0

4b9b3361

Ответ 1

У меня была такая же проблема с session.user, и я просто исправил ее, понимая, что функция app.use должна быть IN частью конфигурации, а не там, где она была раньше.

До:

app.configure();
app.dynamicHelpers({
  user: function(req, res) {
    return req.session.user;
  }
});

После:

app.configure(function(){
  //...
  app.use(function(req, res, next){
    res.locals.user = req.session.user;
    next();
  });
  //...
});

для Flash смотрите connect-flash

Ответ 2

Решение с 16 голосами правильное, но обязательно используйте назначение res.locals до app.use(app.router); обратитесь к этому сообщению fooobar.com/questions/288628/...

Ответ 3

reponse.locals.use - это новая полезная функция Express, которая позволяет отправлять переменную в вашу модель, которая сначала должна быть оценена. Скажем, например, вы хотите отправить 3 переменные в ваше представление, все из которых должны появиться после запроса на mongodb. "Старый" способ состоял в том, чтобы вложить 3 обратных вызова, и когда последний вернется, вы будете отображать свое мнение. locals.use делает это намного проще, так как он будет оценивать ваши функции и отобразит ваше мнение только тогда, когда все будут оценены.

Вот короткий фрагмент кода о том, как их использовать (это кофе script, надеюсь, вы можете преобразовать его в javascript: D) ​​

response.locals.use (request, response, done) ->
    myAsynchMethod (value) ->
        reponse.locals.myProperty = value
        done()

В этом случае будет существовать переменная с именем myProperty, которую вы можете использовать в своем представлении, которая имеет значение, установленное для того, что myAsynchMethod дал обратный вызов.

Ответ 4

Посмотрите папку примеров в github. Например auth:

app.use(function(req, res, next){
  var err = req.session.error,
      msg = req.session.success;
  delete req.session.error;
  delete req.session.success;
  res.locals.message = '';
  if (err) res.locals.message = '<p class="msg error">' + err + '</p>';
  if (msg) res.locals.message = '<p class="msg success">' + msg + '</p>';
  next();
});

Затем вы можете использовать переменную "сообщение" в своем шаблоне.