req.locals vs. res.locals vs. res.data vs. req.data vs. app.locals in Express Middleware

80

Es werden einige ähnliche Fragen gestellt, aber meine Frage lautet: Wenn ich Zwischenergebnisse verbreiten möchte, die ich mit der verschiedenen Routing-Middleware verstehe, wie kann ich das am besten tun?

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

Ich denke, dass ich mit req .locals die gleiche Datenverbreitung durch die verschiedenen Middleware- Programme erzielen kann. Es scheint auch, dass sowohl die Anforderungs- als auch die Antwortobjekte die lokalen Eigenschaften haben, die zu Beginn der Anforderung mit einem leeren Objekt initialisiert wurden.

Auch kann man res.mydata oder req.mydata Eigenschaften auch setzen?

Theoretisch können app.locals auch verwendet werden, um diese Daten durch die verschiedenen Middleware weiterzuleiten, da sie über Middleware hinweg bestehen bleiben. Dies würde jedoch der herkömmlichen Verwendung von app.locals widersprechen. Es wird eher für anwendungsspezifische Daten verwendet. Es ist auch erforderlich, diese Daten am Ende des Anforderungs-Antwort-Zyklus zu löschen, damit dieselben Variablen für die nächste Anforderung verwendet werden können.

Was ist der optimale und standardmäßige Weg, um Zwischenergebnisse durch Middleware zu verbreiten?

Sonnig
quelle

Antworten:

145

Wie Sie erwähnt haben , beide req.locals, res.localsoder sogar Ihre eigenen definierten Schlüssel res.userDataverwendet werden. Wenn Sie jedoch eine Ansichts-Engine mit Express verwenden, können Sie Zwischendaten res.localsin Ihrer Middleware festlegen , und diese Daten sind in Ihrer Ansicht verfügbar (siehe diesen Beitrag ). Es ist üblich, Zwischendaten innerhalb der Middleware einzuschalten req.locals, um ein Überschreiben der Ansichtsdaten zu vermeiden res.locals, obwohl dies nicht offiziell dokumentiert ist.

res.locals Ein Objekt, das lokale Antwortvariablen enthält, die für die Anforderung gültig sind und daher nur für die Ansichten verfügbar sind, die während dieses Anforderungs- / Antwortzyklus (falls vorhanden) gerendert wurden. Ansonsten ist diese Eigenschaft identisch mit app.locals.

Diese Eigenschaft ist nützlich, um Informationen auf Anforderungsebene wie den Namen des Anforderungspfads, den authentifizierten Benutzer, Benutzereinstellungen usw. bereitzustellen.

Quelle: http://expressjs.com/en/api.html#res.locals

xaviert
quelle
Vielen Dank für die Klarstellung der Dokumentationsunterscheidung, die zugunsten von res.locals funktioniert. Sie haben mein Verständnis bestätigt, dass theoretisch alle Ansätze technisch gleich sind. Warten wir auf weitere Kommentare. Ihre Antwort positiv bewertet ... sicherlich nützlich.
Sunny
Randnotiz: res.render()Vorrang vor res.locals. So könnte jemand versehentlich die Variable wie res.locals = { name: 'Jake' } // later in code... res.render('user.template', { name: 'Tony' }, (err, html) => {}) // the 'name' variable is now 'Tony'
folgt
Auf
jeden Fall