req.locals vs. res.locals vs. res.data vs. req.data vs. app.locals w oprogramowaniu pośrednim Express

82

Jest kilka podobnych pytań, ale moje pytanie brzmi: jeśli chcę rozpowszechniać wyniki pośrednie, które otrzymuję za pomocą różnych programów pośredniczących do routingu, jaki jest najlepszy sposób, aby to zrobić?

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();
}
// ...

Myślę, że mogę uzyskać taką samą propagację danych przez różne oprogramowanie pośredniczące, używając req .locals. Wygląda również na to, że zarówno obiekty żądania, jak i odpowiedzi mają właściwości lokalne zainicjowane w pustym obiekcie na początku żądania.

Można też ustawić właściwości res.mydata lub req.mydata?

Teoretycznie app.locals może być również używany do przekazywania tych danych przez różne oprogramowanie pośredniczące, ponieważ będzie istnieć w oprogramowaniu pośrednim, ale byłoby to sprzeczne z konwencjonalnym użyciem app.locals. Jest używany bardziej do danych specyficznych dla aplikacji. Konieczne będzie również wyczyszczenie tych danych na końcu cyklu żądanie-odpowiedź, aby te same zmienne mogły zostać użyte w następnym żądaniu.

Jaki jest optymalny i standardowy sposób rozpowszechniania wyników pośrednich za pomocą oprogramowania pośredniego?

Słoneczny
źródło

Odpowiedzi:

151

Jak wspomniałeś, można użyć obu req.locals, res.localsa nawet własnego zdefiniowanego klucza res.userData. Jednak korzystając z silnika widoku z Express, możesz ustawić dane pośrednie res.localsw oprogramowaniu pośrednim, a dane te będą dostępne w Twoim widoku (zobacz ten wpis ). Powszechną praktyką jest włączanie danych pośrednich w oprogramowaniu pośrednim, req.localsaby uniknąć nadpisywania danych widoku w programie res.locals, chociaż nie jest to oficjalnie udokumentowane.

res.locals Obiekt, który zawiera zmienne lokalne odpowiedzi w zakresie żądania, a zatem dostępne tylko dla widoków renderowanych podczas tego cyklu żądanie / odpowiedź (jeśli istnieją). W przeciwnym razie ta właściwość jest identyczna z app.locals.

Ta właściwość jest przydatna do ujawniania informacji na poziomie żądania, takich jak nazwa ścieżki żądania, uwierzytelniony użytkownik, ustawienia użytkownika i tak dalej.

Źródło: http://expressjs.com/en/api.html#res.locals

xaviert
źródło
Dziękuję za wyjaśnienie dotyczące wyróżnienia dokumentacji, które działa na korzyść res.locals. Potwierdziłeś moje zrozumienie, że teoretycznie wszystkie podejścia są technicznie takie same. Poczekajmy na więcej komentarzy. Głosowałem za twoją odpowiedzią ... z pewnością przydatne
Słoneczny
Uwaga dodatkowa: res.render()ma pierwszeństwo przed res.locals. Więc ktoś mógł przypadkowo nadpisać zmienną w ten sposóbres.locals = { name: 'Jake' } // later in code... res.render('user.template', { name: 'Tony' }, (err, html) => {}) // the 'name' variable is now 'Tony'
zenoh
W każdym razie dobrze zaplanowany, czysty i modułowy projekt oprogramowania pośredniego powinien być lepszym i długoterminowym rozwiązaniem niż tylko poleganie na kluczu pojedynczego obiektu
zenoh