我正在尝试在node.js应用程序中设置会话。为此,我使用模块“ express”,“ express-session”和“ express-mysql-session”将它们存储在服务器上的数据库中。只要我仅在创建会话的路由内访问req.session参数,我的代码就可以正常工作。在其他路由(甚至启动文件)中,创建的参数会引发未定义的错误。
我已经尝试在启动文件中创建app.use(session(...))。如果我这样做,那么一切正常,在某些路由中创建的参数也可以在其他路由中使用。但是由于我想使启动文件尽可能小,因此这些代码行应在路由中处理。
这是我的代码:login.js(一条路线)
var express = require('express');
var router = express.Router();
var session = require('express-session');
var MySQLStore = require('express-mysql-session');
var dbOptions = {
host: "ip",
user: "user",
password: "pw",
database: "some db"
};
var sessionStore = MySQLStore(dbOptions);
router.use(session({
key: 'some key',
secret: 'some secret',
store: sessionStore,
resave: false,
saveUninitialized: false
}));
router.post('/login', (req, res) =>{
req.session.username = req.body.username;
res.end("done");
});
router.get('/sessionTest', (req, res) => {
if(req.session.username) {
res.write(`<h1>Hello ${req.session.username} </h1><br>`);
res.end('<a href='+'/timetracking/logout'+'>Logout</a>');
}
else {
res.write('<h1>Please login first.</h1>');
res.end('<a href='+'/timetracking/login'+'>Login</a>');
}
});
router.get('/logout',(req,res) => {
req.session.destroy((err) => {
if(err) {
return console.log(err);
}
res.redirect('/timetracking/login');
});
});
module.exports = router;
timetracking.js(启动文件)
var http = require('http');
const express = require('express');
const app = express();
var gets = require('./lib/gets');
var login = require('./lib/login');
const session = require('express-session');
//Make '/timetracking/' to the standard handler for get requests
app.use('/timetracking', [gets, login]);
app.get('/test', (req, res) =>{
res.send(req.session.username);
});
app.listen(80);
当我加载localhost / test时,我仍然可以在Web开发人员工具中看到cookie。但是“ req.session.username”是未定义的。
谢谢你的帮助!
req.session
仅在会话中间件执行之后发生的路由中可用(取决于顺序)。而且,如果会话中间件仅在一个路由器上,则req.session
仅在与该路由器匹配的路由中可用,并且仅在该路由器运行给定请求之后才可用。
因此,如果您希望req.session
在所有路由上均有效,则需要尽早定义中间件,并且该中间件必须以一种方式在所有可能的路由(您要在其上使用)上运行,而不只是在仅在某些路由器上运行的某些路由器中运行路径。
记住,req.session
在任何给定的传入请求上设置的都是会话中间件。要访问它,它必须在给定的请求上运行req.session
。
您不必将会话中间件直接放入启动文件中。您仍然可以将其放在自己的模块中,只需要从启动文件中加载该模块并将其传递给app
对象,以便它可以在任何路由之前初始化全局中间件。
这是一个示例启动文件:
const express = require('express');
const app = express();
// initialize global middleware
require('./myMiddleware')(app);
// set up other routers and routes here
// and start the server
并且,一个myMiddlware.js文件:
// load and initialize session stuff
const session = ....;
module.exports = function(app) {
// install session middleware
app.use(session(...))
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句