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. Крім того, схоже, що і для запиту, і для відповіді властивості локалів ініціалізовані до порожнього об’єкта на початку запиту.

Також можна встановити властивості 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. Ви підтвердили моє розуміння того, що теоретично всі підходи технічно однакові. Давайте почекаємо більше коментарів. Проголосував за вашу відповідь ... безумовно корисний.
Сонячно

Примітка: 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

У будь-якому випадку, добре спланований, чистий та модульний дизайн проміжного програмного забезпечення повинен бути кращим та довгостроковим рішенням, ніж просто покладатися на один об'єктний ключ
zenoh,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.