【问题标题】:NodeJS + Express: share session across multiple routesNodeJS + Express:跨多个路由共享会话
【发布时间】:2019-01-21 21:19:18
【问题描述】:

我有一个包含一些路由的 Express Web 应用程序。当 Web 应用与用户交互时,路由需要共享会话。路由在 app.js 的单独 js 文件中声明。

在我的app.js

var createError = require('http-errors');
var express = require('express');
var parseurl = require('parseurl')
var session = require('express-session')
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var p_conf = require('./parse_config');

// Declare routes here
var indexRouter = require('./routes/index');    // index route
var usersRouter = require('./routes/users');    // user route
var itemRouter = require('./routes/items');     // item route

var app = express();

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// set up express-session
var sessionMiddleware = session({
  secret: 'keyboard cat',
  resave: true,
  saveUninitialized: true
});

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/items', itemRouter);

// Assign an object to the session
app.use(function (req, res, next) {
  req.session.test = "test";
  next();
});

module.exports = app;

在我的item.js 中为项目路线:

const path = require('path');
const express = require('express');
const fetch = require('node-fetch');
const router = express.Router();

const p_conf = require('../parse_config');
const db_item = require('../db/db_item');

/* GET route root page. */
router.get('/', function(req, res, next) {
    // Get the object in the session
    console.log(req.session.test);

    db_item.getItems()
    .then(function(result) {
        if (typeof result === "object")
            return res.send(result["results"]);
        else
            return res.send(JSON.stringify({ "Error": String(result) }));       
    })
    .catch((err) => {
        return next(err);
    })
});

module.exports = router;

在 app.js 中,会在 web 应用程序初始化时创建会话并为其分配一个测试对象。项目路由应该获得相同的会话并检索测试对象。但是,当访问根路由时,req.session.test 始终是undefined

项目和用户路由如何访问会话并共享会话范围内的对象?

【问题讨论】:

    标签: javascript node.js express session express-session


    【解决方案1】:

    尝试更改app.js 中声明路由和会话的顺序。另外,在使用会话之前需要使用sessionMiddlware (app.use)。

    var sessionMiddleware = session({
      secret: 'keyboard cat',
      resave: true,
      saveUninitialized: true
    });
    
    app.use(sessionMiddleware);
    app.use(function (req, res, next) {
      req.session.test = "test";
      next();
    });
    
    app.use('/', indexRouter);
    app.use('/users', usersRouter);
    app.use('/items', itemRouter);
    

    【讨论】:

    • 如果我将会话更改为“app.use('/items', sessionMiddleware, itemRouter);”,我发现会话在路由中工作但这是正确的语法吗?
    • 是的,但会话仅适用于/items 路由。
    • 是的,那么我需要为每条路线添加sessionMiddleware。对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2020-01-25
    • 1970-01-01
    • 2015-04-13
    • 2015-07-29
    • 2016-08-01
    相关资源
    最近更新 更多