var express = require("express")
var parseurl = require("parseurl")
var session = require("express-session")
var app = express()
app.use(session({
secret: "keyboard cat",
resave: false,
saveUninitialized: true
}))
Questo è il mio semplice codice. Tuttavia, voglio usare la sessione solo se il req.url
contiene /web
. C'è un modo per avvolgerlo in un middleware tutto mio?
Ho provato:
function setSession(req,res,next){
if(req.url.indexOf("/api") != 0){
app.use(session({
secret: "keyboard cat",
resave: false,
saveUninitialized: true
}));
next();
}else{
next();
}
};
e poi
app.use(setSession);
Ma ambientazione req.session.hello = "world"
nel mio controller dà: TypeError: Cannot set property "hello" of undefined
. In poche parole, non funziona. I miei argomenti sono sbagliati nel mio middleware?
risposte:
1 per risposta № 1Tuttavia, voglio usare la sessione solo se req.url contiene / web. C'è un modo per avvolgerlo in un middleware tutto mio?
Certamente puoi. Puoi usare express.Router
per creare percorsi secondari, in questo modo:
var sessionMiddleware = session({
secret: "keyboard cat",
resave: false,
saveUninitialized: true
});
var webRoutes = express.Router()
.get("/", function(req, res, next) {
res.send("I have a session!");
});
var nonWebRoutes = express.Router()
.get("/", function(req, res, next) {
res.send("No session here");
});
app.use("/web", express.Router()
.use(sessionMiddleware)
.use(webRoutes));
app.use("/nonweb", nonWebRoutes);
Modificare:
Se tuttavia si desidera eseguire in modo condizionale la funzione middleware, è possibile farlo in questo modo:
app.use(function(req, res, next) {
if (req.url.indexOf("/api") !== 0) {
sessionMiddleware(req, res, next);
} else {
next();
}
});
app.get("/api", function(req, res, next) {
res.send(!!req.session); //false
});
app.get("/web", function(req, res, next) {
res.send(!!req.session); //true
});
Ma preferisco l'approccio sub-route perchéassocia la struttura del percorso del percorso a una gerarchia che semplifica la lettura del codice e incorpora altri middleware che utilizzano sessioni, ad esempio passport.js.