req.locals против res.locals против res.data против req.data против app.locals в промежуточном программном обеспечении Express

82

Есть несколько похожих вопросов, но мой вопрос в том, что если я хочу распространить промежуточные результаты, полученные с помощью другого промежуточного программного обеспечения маршрутизации, как лучше всего это сделать?

app.use(f1); app.use(f2); app.use(f3);

function f1(req,res,next) {
  //some database queries are executed and I get results, say x1
  res.locals.dbResults = {...};
  next();
}

function f2(req,res,next) {
  // more processing based upon req.locals.dbResults 
  res.locals.moreResults = {....};
  next();
}
// ...

Я думаю, что могу добиться такого же распространения данных через другое промежуточное ПО, используя req .locals. Кроме того, похоже, что оба объекта запроса и ответа имеют свойства locals, инициализированные пустым объектом в начале запроса.

Кроме того, можно также установить свойства res.mydata или req.mydata?

Теоретически app.locals также можно использовать для передачи этих данных через различное промежуточное программное обеспечение, поскольку они будут сохраняться в промежуточном программном обеспечении, но это будет противоречить обычному использованию app.locals. Он больше используется для конкретных данных приложения. Также необходимо будет очистить эти данные в конце цикла запрос-ответ, чтобы те же переменные можно было использовать для следующего запроса.

Каков оптимальный и стандартный способ распространения промежуточных результатов через промежуточное ПО?

Солнечный
источник

Ответы:

151

Как уже упоминалось, как req.locals, res.localsили даже ваш собственный определенный ключ res.userDataможет быть использован. Однако при использовании механизма представления с Express вы можете установить промежуточные данные res.localsв промежуточном программном обеспечении, и эти данные будут доступны в вашем представлении (см. Этот пост ). Обычной практикой является установка промежуточных данных внутри промежуточного программного обеспечения, req.localsчтобы избежать перезаписи данных представления res.locals, хотя это официально не задокументировано.

res.locals Объект, который содержит локальные переменные ответа, привязанные к запросу и, следовательно, доступные только для представлений, отображаемых во время этого цикла запроса / ответа (если есть). В остальном это свойство идентично app.locals.

Это свойство полезно для предоставления информации на уровне запроса, такой как имя пути запроса, аутентифицированный пользователь, пользовательские настройки и т. Д.

Источник: http://expressjs.com/en/api.html#res.locals

Ксавьер
источник
Спасибо за разъяснение различий в документации, которые работают в пользу res.locals. Вы подтвердили мое понимание того, что теоретически все подходы технически одинаковы. Подождем больше комментариев. Проголосовал за ваш ответ ... безусловно, полезно.
Sunny
Боковое примечание: res.render()иметь приоритет res.locals. Так что кто-то мог случайно перезаписать переменную вот такres.locals = { name: 'Jake' } // later in code... res.render('user.template', { name: 'Tony' }, (err, html) => {}) // the 'name' variable is now 'Tony'
zenoh 01
В любом случае, хорошо спланированный, чистый и модульный дизайн промежуточного программного обеспечения должен быть лучшим и долгосрочным решением, чем просто использование единственного объектного ключа
zenoh 01