/ / Accesso a res.locals dopo app.router - node.js, express, connect, middleware

Accesso a res.locals dopo app.router - node.js, express, connect, middleware

Sto creando il middleware da chiamare dopo app.router e ho bisogno di accedere ai dati che sono stati memorizzati nell'oggetto res.locals dal middleware del percorso e dal gestore del percorso.

//...
app.use(app.router);
app.use(myMiddleware);
//...

app.get("/", function(req, res) {
res.locals.data = "some data";
});

function myMiddleware(req, res, next) {
if (res.locals.data)
console.log("there is data");
else
console.log("data is removed"); // that"s what happens
}

Il problema è che tutte le proprietà di res.locals diventano vuote dopo app.router.

Ho cercato di trovare il posto dove express o connect pulisce res.locals in qualche modo lo patch ma finora non riesco a trovarlo.

L'unica soluzione che vedo al momento èabbandonare l'idea di mettere questa logica in un middleware separato e inserirla nel middleware route-specific, dove res.locals è disponibile, ma renderà il sistema molto più interconnesso. Inoltre ho molti percorsi in cui il middleware del percorso non chiama dopo (quando viene chiamato res.redirect), quindi dovrò fare molte modifiche per farlo funzionare. Mi piacerebbe molto evitarlo e mettere questa logica in un middleware separato, ma ho bisogno di accedere ai dati che sono stati memorizzati in res.locals.

Qualsiasi aiuto davvero apprezzato.

risposte:

5 per risposta № 1

Puoi eventualmente legarlo prima, ma farlo agire dopo. Il logger middleware è un esempio di questo.

app.use(express.logger("tiny"));
app.use(myMiddleware);
app.use(app.router);

function myMiddleware(req, res, next) {
var end = res.end;
res.end = function (chunk, encoding) {
res.end = end;
res.end(chunk, encoding);

if (res.locals.data)
console.log("there is data");
else
console.log("data is removed");
};

next();
}

app.get("/", function (req, res) {
res.locals.data = "some data";
res.send("foo"); // calls `res.end()`
});

Richiesta / risultati in:

GET / 200 3 - 6 ms
there is data
GET /favicon.ico 404 - - 1 ms
data is removed