简体   繁体   English

NodeJS + Express:跨多个路由共享会话

[英]NodeJS + Express: share session across multiple routes

I have an Express web application with some routes. 我有一个带有某些路由的Express Web应用程序。 The routes need to share the session when the web app interacts with users. 当网络应用与用户交互时,路由需要共享会话。 The routes are declared in separate js files from the app.js. 路由是在与app.js分开的js文件中声明的。

In my app.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;

In my item.js for the item route: 在我的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;

In the app.js the session is created and assigned with a test object when the web app is initialised. 在初始化Web应用程序时,在app.js中创建会话并为其分配测试对象。 The item route is supposed to get the same session and retrieve the test object. 项目路由应该获得相同的会话并检索测试对象。 However, req.session.test is always undefined when the route root is accessed. 但是,访问路由根时, req.session.test始终是undefined的。

How can the item and user routes access the session and share the session scoped objects across? 项目和用户路由如何访问会话并共享会话范围的对象?

Try changing the order of declaring routes and session in app.js . 尝试更改app.js中声明路由和会话的顺序。 Also, need to use sessionMiddlware ( app.use ) before using session. 另外,在使用会话之前需要使用sessionMiddlwareapp.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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM