在路由中创建的会话在其他路由中不可用

涂料

我正在尝试在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”是未定义的。

谢谢你的帮助!

jfriend00

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在登录路由中生成身份验证令牌,并在其他路由中要求它

来自分类Dev

会话变量在其他页面上不可用。

来自分类Dev

快速使mongodb数据在路由中可用

来自分类Dev

在路由中获取TypeError

来自分类Dev

在路由中传递对象

来自分类Dev

从AngularJS路由中删除#

来自分类Dev

Rails路由中的变量

来自分类Dev

CakePHP路由中断

来自分类Dev

在路由中获取TypeError

来自分类Dev

Rails路由中的变量

来自分类Dev

Koa路由中的收益

来自分类Dev

如何在路由中正确访问会话cookie

来自分类Dev

子路由中的routerLink错误

来自分类Dev

Silex 2:路由中的RegEx

来自分类Dev

路由中的参数未解析

来自分类Dev

Angular路由中的动态页面

来自分类Dev

路由中的MVC默认链接

来自分类Dev

子路由中的routerLink错误

来自分类Dev

路由中的 Laravel 传递数组

来自分类Dev

Laravel 路由中“/”和“./”的区别?

来自分类Dev

创建异步函数以稍后在快速路由中调用结果

来自分类Dev

IP路由中的默认路由

来自分类Dev

状态计算的属性在其他计算的属性中不可用?

来自分类Dev

@global gemset中安装的宝石在其他gemset中不可用

来自分类Dev

数据绑定在其他功能中不可用

来自分类Dev

LESS Mixins 在其他导入的 LESS 文件中不可用

来自分类Dev

如何防止application.hbs出现在其路由中

来自分类Dev

WebAPI路由中的通配符参数不应匹配

来自分类Dev

属性路由中的可选静态值