【问题标题】:Express.js session undefined. RedisExpress.js 会话未定义。雷迪斯
【发布时间】:2017-03-20 07:23:03
【问题描述】:

尝试使用 Redis 设置会话。我的 Redis DB 在一个 dokku 容器中,链接到我的应用程序(也在一个 dokku 容器中)。我不断收到未定义的会话。我已经将事情剥离到最低限度,还检查了事情的运行顺序。我仍然得到一个未定义的。

我在这里读过'session' is undefined when using express / redis for session storeExpress js session undefined 无济于事。

我不需要使用 cookie-parser,因为 expression-session 中包含 cookie 内容,并且文档说 cookie-parser 可能会导致 expression-session 出现问题。

var express = require('express');
var session = require('express-session');
var redisStore = require('connect-redis')(session);
var bodyParser = require('body-parser');

var app = express();

app.set('port', (process.env.PORT || 5000));

var redisURL =  'redis://xxxxx:1234567@bar-redis-foo:6379';
var store = new redisStore({ url: redisURL });

app.use(session({
    secret: 'ssshhhhh',
    store: store,
    saveUninitialized: true,
    resave: true
}));


app.use(express.static(__dirname + '/public'));
app.use(bodyParser.json()); // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({ // to support URL-encoded bodies
    extended: true
}));

app.get('/', function(req, res, next) {
    console.log(req.session); // Logs Undefined
    res.send('Hello');
});

【问题讨论】:

  • 错误的行号和确切的错误信息
  • @JasonLivesay 它的 console.logs 未定义。会话未定义。谢谢
  • app.get('/', function(req, res, next) { console.log(req.session); // 记录未定义 res.send('Hello'); });

标签: node.js session express cookies redis


【解决方案1】:

检查您的 redis 连接并再次运行。示例代码如下。

"use strict";

const express = require("express");
const bodyParser = require("body-parser");
const session = require("express-session");
const RedisStore = require("connect-redis")(session);

const app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));

app.use(session({
    secret: "$kx(Fj$uB!Ug!@jCkguFmc6f7t<c-e$9",
    resave: false,
    saveUninitialized: true,
    store: new RedisStore({
        url: "redis://:********@pub-redis-12766.eu-central-1-1.1.ec2.redislabs.com:12766",
        ttl: 5 * 60 // 5 minute (Session store time)
    })
}));

app.use(function (request, response, next) {
    let path = request.originalUrl;

    if (request.session.user) {
        request.session.reload(function (err) { //session expire time regenerate
            if (!err) {
                next();
            } else {
                response.redirect('/login');
            }
        });
    } else {
        if (path == '/login') {
            next();
        } else {
            response.redirect('/login');
        }
    }
});

app.get('/', function(request, response) {
    if (request.session.user) {
        response.send(request.session.user);
    } else {
        response.redirect("/login");
    }
});

app.get('/login', function(request, response) {
    if (request.session.user) {
        response.redirect("/");
    } else {
        request.session.user = {username: "halil"}; //custom key {user} and custom data {username: "halil"}
    }

    response.send('Login');
});

app.get('/logout', function(request, response) {
    if (request.session.user) {
        request.session.destroy();
        response.redirect("/login");
    } else {
        response.redirect("/login");
    }
});

app.listen(app.get('port'), function () {
    console.log('App is working on port: ' + app.get('port'));
});

【讨论】:

  • 感谢 Halil Ibrahim SAFAK - 这也失败了(但是,我赞成它,因为它是迄今为止我见过的最好的示例代码)。我现在认为我的 Redis 连接失败了......但是,我仍在试图弄清楚如何检查这一点。我将如何注销成功的连接?如果我将密码更改为垃圾 - 它会引发错误(但这并不一定意味着正确的密码正在连接)。
  • 您可以使用redislabs(redislabs.com) 进行测试。当从计算机发出请求时,就会发生会话。因此仅检查是否建立了会话是不够的。因此,有必要添加自定义数据。您可以检查此数据以进行交易。当用户登录时,您可以将用户与添加到会话值的自定义数据区分开来。
  • 使用 Redislabs 设置,并复制您的示例 - 它可以工作。一定是因为我是如何安装 Redis 的。谢谢!
猜你喜欢
  • 2015-04-09
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
相关资源
最近更新 更多