简体   繁体   中英

NodeJS + Express: share session across multiple routes

I have an Express web application with some routes. 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.

In my 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:

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

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 . Also, need to use sessionMiddlware ( app.use ) before using session.

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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