- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
今天早上我醒来发现 Nodejitsu 出现以下错误:
警告:connection.session() MemoryStore 不是为生产环境设计的,因为它会泄漏内存,并且不会扩展到单个进程。
“那么好吧!”我心想 - 然后我去寻找更合适的东西。我选择了 Redis,并立即开始在我的应用程序中实现 connect-redis
和 node-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
loggedIn
只是指 req.session.loggedIn
,这是我用来跟踪登录用户的 session 变量。以下是有问题的应用程序代码:
var express = require('express');
var crypto = require('crypto');
var mongoose = require('mongoose');
var nodemailer = require('nodemailer');
var request = require('request');
var underscore = require('underscore');
var mandrill = require('node-mandrill')('0bFNPDenlDiZtu7aXujDQQ');
var connect = require('connect');
var engines = require('consolidate');
var fs = require('fs');
var redis = require("redis").createClient();
var RedisStore = require('connect-redis')(express);
var sessionStore = new RedisStore({
client: redis
});
var stripe_api_key = 'KEY';
var Stripe = require('stripe')(stripe_api_key);
var app = express();
app.configure(function() {
app.engine('html', engines.jade);
app.set('view engine', 'html');
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.session({secret: "svtabyrki4q786as37c785ta8vi56aiw4i8w467acv", store: sessionStore}));
app.use(express.static(__dirname + '/www'));
app.use(express.compress());
app.use(app.router);
});
// Mongoose Connection
var db = mongoose.connection;
var dbURI = 'HIDDENURL';
db.on('disconnected', function() {
mongoose.connect(dbURI, {server:{auto_reconnect:true}});
});
db.on('error', function(error) {
console.error('Error in MongoDb connection: ' + error);
mongoose.disconnect();
});
mongoose.connect(dbURI, {server:{auto_reconnect:true}});
// Mongoose Object Models
var User = require('./object_models/user')(mongoose, nodemailer, mandrill);
var Notifications = require('./object_models/notification')(mongoose, nodemailer);
var Experience = require('./object_models/experience')(mongoose, nodemailer);
var Booking = require('./object_models/booking')(mongoose, nodemailer);
var Review = require('./object_models/review')(mongoose, nodemailer);
var Heart = require('./object_models/heart')(mongoose, nodemailer);
var Message = require('./object_models/message')(mongoose, nodemailer);
// Nodemailer Settings
var smtpTransport = nodemailer.createTransport("SMTP",{
service: "Gmail",
auth: {
user: "ryan@aggregus.com",
pass: pwd
}
});
// Bootstrap Call
app.get('/', function(req, res) {
res.render('../index.html');
console.log("WUSUP");
});
为了进一步说明,这是我迄今为止尝试过但无济于事的方法:
app.use(express.cookieParser());
放置在 express.session
调用之前,正如该主题的大多数文章所建议的那样。new RedisStore
调用在初始化时直接引用 client
。express.session
和 'express.cookieParser' 的初始化调用之后放置了 app.use(app.router)
。createClient()
调用,我的 Redis 服务器功能齐全。这similar question已通过阻止相当微不足道的 app.use
初始化来在 Express 的 sessionStore 被初始化之前调用 app.router
来解决。
因此,TL;DR:在使用 connect-redis
时,我的 session 变量返回 undefined
。我已经在网上搜索了答案,我唯一的线索是 app.router
是在 Express 自己的 session 处理之前启动的。那个小故障发生的地方超出了我的范围。 Stack Overflow 的众神怜悯我可怜的灵魂。
编辑:认为 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 install --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);
关于javascript - session 未定义 - 使用 Connect-Redis/ExpressJS/Node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17600272/
我有一个关于 Redis Pubsub 的练习,如下所示: 如果发布者发布消息但订阅者没有收到服务器崩溃。订阅者如何在重启服务器时收到该消息? 请帮帮我,谢谢! 最佳答案 在这种情况下,消息将永远消失
我们正在使用 Service Stack 的 RedisClient 的 BlockingDequeue 来保存一些数据,直到它可以被处理。调用代码看起来像 using (var client =
我有一个 Redis 服务器和多个 Redis 客户端。每个 Redis 客户端都是一个 WebSocket+HTTP 服务器,其中包括管理 WebSocket 连接。这些 WebSocket+HTT
我有多个 Redis 实例。我使用不同的端口创建了一个集群。现在我想将数据从预先存在的 redis 实例传输到集群。我知道如何将数据从一个实例传输到集群,但是当实例多于一个时,我无法做到这一点。 最佳
配置:三个redis集群分区,跨三组一主一从。当 Master 宕机时,Lettuce 会立即检测到中断并开始重试。但是,Lettuce 没有检测到关联的 slave 已经将自己提升为 master
我想根据从指定集合中检索这些键来删除 Redis 键(及其数据集),例如: HMSET id:1 password 123 category milk HMSET id:2 password 456
我正在编写一个机器人(其中包含要禁用的命令列表),用于监视 Redis。它通过执行禁用命令,例如 (rename-command ZADD "")当我重新启动我的机器人时,如果要禁用的命令列表发生变化
我的任务是为大量听众使用发布/订阅。这是来自 docs 的订阅的简化示例: r = redis.StrictRedis(...) p = r.pubsub() p.subscribe('my-firs
我一直在阅读有关使用 Redis 哨兵进行故障转移的内容。我打算有1个master+1个slave,如果master宕机超过1分钟,就把slave变成master。我知道这在 Sentinel 中是
与仅使用常规 Redis 和创建分片相比,使用 Redis 集群有哪些优势? 在我看来,Redis Cluster 更注重数据安全(让主从架构解决故障)。 最佳答案 我认为当您需要在不丢失任何数据的情
由于 Redis 以被动和主动方式使 key 过期, 有没有办法得到一个 key ,即使它的过期时间已过 (但 在 Redis 中仍然存在 )? 最佳答案 DEBUG OBJECT myKey 将返回
我想用redis lua来实现monitor命令,而不是redis-cli monitor。但我不知道怎么办。 redis.call('monitor') 不起作用。 最佳答案 您不能从 Redis
我读过 https://github.com/redisson/redisson 我发现有几个 Redis 复制设置(包括对 AWS ElastiCache 和 Azure Redis 缓存的支持)
Microsoft.AspNet.SignalR.Redis 和 StackExchange.Redis.Extensions.Core 在同一个项目中使用。前者需要StackExchange.Red
1. 认识 Redis Redis(Remote Dictionary Server)远程词典服务器,是一个基于内存的键值对型 NoSQL 数据库。 特征: 键值(key-value)型,value
1. Redis 数据结构介绍 Redis 是一个 key-value 的数据库,key 一般是 String 类型,但 value 类型多种多样,下面就举了几个例子: value 类型 示例 Str
1. 什么是缓存 缓存(Cache) 就是数据交换的缓冲区,是存贮数据的临时地方,一般读写性能较高。 缓存的作用: 降低后端负载 提高读写效率,降低响应时间 缓存的成本: 数据一致性成本 代码维护成本
我有一份记录 list 。对于我的每条记录,我都需要进行一些繁重的计算,因为我要在Redis中创建反向索引。为了达到到达记录,需要在管道中执行多个redis命令(sadd为100 s + set为1
我有一个三节点Redis和3节点哨兵,一切正常,所有主服务器和从属服务器都经过验证,并且哨兵配置文件已与所有Redis和哨兵节点一起更新,但是问题是当Redis主服务器关闭并且哨兵希望选举失败者时再次
我正在尝试计算Redis中存储的消息之间的响应时间。但是我不知道该怎么做。 首先,我必须像这样存储chat_messages的时间流 ZADD conversation:CONVERSATION_ID
我是一名优秀的程序员,十分优秀!