Javascript 会话未定义-使用Connect Redis/ExpressJS/Node

Javascript 会话未定义-使用Connect Redis/ExpressJS/Node,javascript,node.js,express,redis,connect,Javascript,Node.js,Express,Redis,Connect,今天早上醒来,我发现野田佳久犯了以下错误: 警告:connection.session()MemoryStore不是为生产环境设计的,因为它会泄漏内存,并且不会扩展到单个进程。 “那么好吧!”我心里想——然后我就去找更合适的。我选择了Redis,并立即开始在我的应用程序中实现连接Redis和节点Redis 但是,在多次尝试修复后,以下错误仍会继续出现。错误如下: TypeError: Cannot set property 'loggedIn' of undefined at /

今天早上醒来,我发现野田佳久犯了以下错误:

警告:connection.session()MemoryStore不是为生产环境设计的,因为它会泄漏内存,并且不会扩展到单个进程。

“那么好吧!”我心里想——然后我就去找更合适的。我选择了Redis,并立即开始在我的应用程序中实现
连接Redis
节点Redis

但是,在多次尝试修复后,以下错误仍会继续出现。错误如下:

TypeError: Cannot set property 'loggedIn' of undefined
        at /Users/Ryan/Aggregus/server.js:300:25
        at Promise.<anonymous> (/Users/Ryan/Aggregus/object_models/user.js:60:5)
        at Promise.<anonymous> (/Users/Ryan/Aggregus/node_modules/mongoose/node_modules/mpromise/lib/promise.js:162:8)
        at Promise.EventEmitter.emit (events.js:95:17)
        at Promise.emit (/Users/Ryan/Aggregus/node_modules/mongoose/node_modules/mpromise/lib/promise.js:79:38)
        at Promise.fulfill (/Users/Ryan/Aggregus/node_modules/mongoose/node_modules/mpromise/lib/promise.js:92:20)
        at /Users/Ryan/Aggregus/node_modules/mongoose/lib/query.js:1813:13
        at model.Document.init (/Users/Ryan/Aggregus/node_modules/mongoose/lib/document.js:243:11)
        at completeOne (/Users/Ryan/Aggregus/node_modules/mongoose/lib/query.js:1811:10)
        at /Users/Ryan/Aggregus/node_modules/mongoose/lib/query.js:1779:11
为了进一步澄清,以下是我在这一点上尝试过但没有成功的方法:

  • 我已经放置了
    app.use(express.cookieParser())express.session
    通话之前进行code>
  • 我已确保我的
    新Redistore
    调用在初始化时直接引用
    客户机
  • 我将
    app.use(app.router)
    放在
    express.session
    和'express.cookieParser'的初始化调用之后
  • 通过
    createClient()
    调用,我的Redis服务器功能齐全
  • 这是通过阻止一个非常不重要的
    应用程序来解决的。在初始化Express'会话存储之前,使用
    初始化调用
    应用程序路由器

    因此,TL;DR:在使用
    connectredis
    时,我的会话变量返回
    undefined
    。我在网上搜寻答案,唯一的线索是,
    app.router
    在Express自己的会话处理之前启动。那个小故障发生在哪里我不知道。我可怜的灵魂得到了上帝的怜悯

    编辑:我认为package.json可能很方便参考。通过NodeJitsu生成:

    {
      "name": "Aggregus",
      "subdomain": "aggregus-Aggregus",
      "scripts": {
        "start": "node server.js"
      },
      "version": "0.0.0-14",
      "engines": {
        "node": "0.8.x"
      },
      "dependencies": {
        "connect": "2.7.8",
        "consolidate": "0.9.1",
        "express": "3.2.2",
        "jade": "0.30.0",
        "mongoose": "3.6.9",
        "node-mandrill":"1.0.1",
        "nodemailer": "0.4.1",
        "request":"2.22.0",
        "stripe": "1.3.0",
        "underscore":"1.4.4"
      }
    }
    

    您调用connect redis时出错,并且不需要单独安装redis。但是,我在您的package.json中没有看到connect redis,因此您应该
    npm安装--save connect redis
    。然后像这样做:

    var express = require('express');
    var RedisStore = require('connect-redis')(express);
    var ports = require('./classes/ports.js');
    var config = require('./config/config.js');
    var routes = require('./routes');
    var errors = require('./classes/errors.js');
    
    var app = express();
    ports(app);
    app
    .use(express.logger())
    .use(express.compress())
    .use(express.cookieParser())
    .use(express.session({
      store: new RedisStore({
        port: config.redisPort,
        host: config.redisHost,
        db: config.redisDatabase,
        pass: config.redisPassword
      }),
      secret: 'Your secret here',
      proxy: true,
      cookie: { secure: true }
    }))
    .use(express.favicon(__dirname + '/../public/img/favicon.ico'))
    .use(express.bodyParser())
    .use(express.methodOverride())
    
    routes(app);
    errors(app);
    

    嘿@dankohn在传递任何请求之前,我如何设置一个函数来立即从cookie中设置req.user?您几乎肯定想要使用passport或everyauth。下面是一个设置cookie的示例,您可以在靠近顶部的地方进行设置:一个问题是这部分应该在主循环中实现,还是在集群检查的情况下实现
    var express = require('express');
    var RedisStore = require('connect-redis')(express);
    var ports = require('./classes/ports.js');
    var config = require('./config/config.js');
    var routes = require('./routes');
    var errors = require('./classes/errors.js');
    
    var app = express();
    ports(app);
    app
    .use(express.logger())
    .use(express.compress())
    .use(express.cookieParser())
    .use(express.session({
      store: new RedisStore({
        port: config.redisPort,
        host: config.redisHost,
        db: config.redisDatabase,
        pass: config.redisPassword
      }),
      secret: 'Your secret here',
      proxy: true,
      cookie: { secure: true }
    }))
    .use(express.favicon(__dirname + '/../public/img/favicon.ico'))
    .use(express.bodyParser())
    .use(express.methodOverride())
    
    routes(app);
    errors(app);