【问题标题】:Can't use connect-redis in Express.js无法在 Express.js 中使用 connect-redis
【发布时间】:2014-06-08 14:14:38
【问题描述】:

我正在研究 Express.js 并学习了如何使用 cookie-session 模块处理会话。我正在尝试使用 express-session,但我遇到了问题。

以前,我使用的是 cookie-session 而不是 express-session,并且 memoryStore 运行良好。但是,我不能将 connect-redis 与 cookie-session 一起使用,因此我安装了 express-session,但是有了它,我不能使用任何类型的存储,也不能使用 memoryStore,也不能使用 Redis。

Redis DB 位于 redistogo 上,其 URI 如下所示:(为安全起见,虽然这只是为了练习,但已屏蔽) redis://redistogo:e34d3****************************f4bb@albacore.redistogo.com:10072/

但是,当我运行“节点应用程序”时,它会打印一个错误。

我的 package.json:

{
   "name": "application-name",
   "version": "0.0.1",
   "author": "Me <me@gmail.com>",
   "license": "MIT",
   "private": true,
   "scripts": {
      "start": "node app"
   },
   "dependencies": {
     "express": "4.x.x",
     "cookie-parser": "1.x.x",
     "express-session": "1.x.x",
     "connect-redis": "2.x.x"
   }
}

“npm ls”显示如下:

├─┬ connect-redis@2.0.0
│ ├── debug@0.8.0
│ └── redis@0.10.1
├─┬ cookie-parser@1.0.1
│ ├── cookie@0.1.0
│ └── cookie-signature@1.0.3
├─┬ express@4.0.0
│ ├─┬ accepts@1.0.0
│ │ ├── mime@1.2.11
│ │ └── negotiator@0.3.0
│ ├── buffer-crc32@0.2.1
│ ├── cookie@0.1.0
│ ├── cookie-signature@1.0.3
│ ├── debug@0.8.0
│ ├── escape-html@1.0.1
│ ├── fresh@0.2.2
│ ├── merge-descriptors@0.0.2
│ ├── methods@0.1.0
│ ├── parseurl@1.0.1
│ ├── path-to-regexp@0.1.2
│ ├── qs@0.6.6
│ ├── range-parser@1.0.0
│ ├─┬ send@0.2.0
│ │ └── mime@1.2.11
│ ├─┬ serve-static@1.0.1
│ │ └─┬ send@0.1.4
│ │   ├── fresh@0.2.0
│ │   ├── mime@1.2.11
│ │   └── range-parser@0.0.4
│ ├─┬ type-is@1.0.0
│ │ └── mime@1.2.11
│ └── utils-merge@1.0.0
└─┬ express-session@1.0.3
  ├── buffer-crc32@0.2.1
  ├── cookie@0.1.2
  ├── cookie-signature@1.0.3
  ├── debug@0.7.4
  ├── uid2@0.0.3
  └── utils-merge@1.0.0

我的 app.js:

//create express app
var http = require('http');
var express = require('express');
var app = express();

//add express-session
var session = require('express-session');
var RedisStore = require('connect-redis')(express);
app.use(session({
   store: new RedisStore({
      host: "redis://redistogo:e34d3***********************f4bb@albacore.redistogo.com:10072/"
   })
}));

//routing
var router1 = require('./router/router1')(app);
var router2 = require('./router/router2')(app);

//Deploying server
http.createServer(app).listen(3000, function () {
   console.log('Deployed!!');
});

运行“node app”时出现的错误:

luis@luis-laptop ~/www/express2 $ node app

/home/luis/www/express2/node_modules/connect-redis/lib/connect-redis.js:96
  RedisStore.prototype.__proto__ = Store.prototype;
                                    ^
TypeError: Cannot read property 'prototype' of undefined
    at module.exports (/home/luis/www/express2/node_modules/connect-redis/lib/connect-redis.js:96:41)
    at Object.<anonymous> (/home/luis/www/express2/app.js:18:42)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:902:3

我应该使用什么会话模块?以及如何使用 Redis 进行设置?

【问题讨论】:

    标签: node.js session express redis cookie-session


    【解决方案1】:

    这个:

    var RedisStore = require('connect-redis')(express);
    

    应该是:

    var RedisStore = require('connect-redis')(session);
    

    编辑:您还需要npm install cookie-parser 并在顶部包含var cookieParser = require('cookie-parser');,然后在app.use(session({ ... })); 之前包含app.use(cookieParser());

    【讨论】:

    • 原型错误不再显示。现在,当我尝试调用路由 localhost:3000/name My ./router/router1: module.exports = function (app) { app.get('/name', function (req, res) { req.session.name = "Luis"; }); };
    • 新错误:TypeError: Cannot set property 'name' of undefined at Object.handle (/home/luis/www/express2/router/router2.js:3:26) at next_layer (/home/luis/www/express2/node_modules/express/lib/router/route.js:103:13) at Route.dispatch (/home/luis/www/express2/node_modules/express/lib/router/route.js:107:5) at c (/home/luis/www/express2/node_modules/express/lib/router/index.js:195:24) at Function.proto.process_params (/home/luis/www/express2/node_modules/express/lib/router/index.js:251:12)
    • 哦,您还需要npm install cookie-parser 并在顶部包含var cookieParser = require('cookie-parser');,然后在您的app.use(session({ ... })); 之前包含app.use(cookieParser());
    • 好的,cookie-parser@1.0.1 已安装。我以前用过它,只是为了创建 cookie,而且效果很好。补充:var cookieParser = require('cookie-parser'); app.use(cookieParser());var app=express(); 之后和var expressSession = require('express-session'); 之前但是,它会打印相同的错误。如果我只使用没有 Redis 的 express-session,我会得到同样的错误 Cannot set property 'name' of undefined at Object.handle...
    【解决方案2】:

    你需要redis客户端

    var redis = require('redis').createClient();
    

    【讨论】:

      猜你喜欢
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      相关资源
      最近更新 更多