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

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

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

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

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

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

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

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