/ / Come posso usare Node.js Express-session all'interno di un middleware condizionale? - node.js, sessione, espresso

Come posso utilizzare Node.js Express-session all'interno di un middleware condizionale? - node.js, session, express

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 № 1

Tuttavia, 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.