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