【问题标题】:Error in NodeJS when using express session with Redis将快速会话与 Redis 一起使用时 NodeJS 中的错误
【发布时间】:2016-06-08 19:03:28
【问题描述】:

我在 Node.js 中有一个项目,我在其中使用 express-session 中的 MemoryStore,但是当我更改为使用带有 redis (connect-redis) 的会话时,我收到错误 ERR wrong number of arguments for 'set '命令访问任何页面时无法登录(因为会话没有创建,或者创建不正确)。

为了找出发生这种情况的原因,我创建了一个简单的项目来查看导致错误的原因,但即使经过大量搜索,我也找不到原因。我按照https://github.com/tj/connect-redis 中的说明进行操作,并在https://stackoverflow.com/ 中看到了很多示例,但错误仍在发生。我以更多方式进行了测试(注释行和其他),但它仍在发生。仅在访问页面时发生(localhost:3000,此测试中只有此页面),而不是在服务器启动时发生。


package.json 文件:

{
  "name": "test",
  "description": "Test",
  "version": "0.0.1",
  "private": false,
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "^4.13.1",
    "express-load": "^1.1.15",
    "express-session": "^1.13.0",
    "cookie-parser": "^1.4.1",
    "redis": "^2.4.2",
    "connect-redis": "^3.0.2",
    "ejs": "^2.4.1"
  }
}

app.js 文件:

const SECRET = 'test';

var express = require('express')
  , load = require('express-load')
  , expressSession = require('express-session')
  , cookieParser = require('cookie-parser')
  , cookie = cookieParser(SECRET)
  //, cookie = cookieParser()
  , redis = require('redis')
  , RedisStore = require('connect-redis')(expressSession)
  //, redisClient = redis.createClient()
  , redisClient = redis.createClient({host: '127.0.0.1', port: '6379'})
  , store = new RedisStore({client: redisClient})
  //, store = new RedisStore({host: '127.0.0.1', port: '6379'})
  //, store = new expressSession.MemoryStore()
  , session = expressSession({
      store: store,
      secret: SECRET, 
      resave: true, 
      saveUninitialized: true
    })
  , app = express()
  , server = require('http').Server(app)
;

app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(cookie);
app.use(session);

load('controllers')
  .then('routes')
  .into(app)
;

server.listen(3000, function() {
  console.log('Testing...');
});

如果我评论 , store = new RedisStore({client: redisClient}) 并取消评论 , store = new expressSession.MemoryStore(),我不会收到错误,并且它适用于会话。这个测试项目非常简单,当我像我看到的许多其他示例一样做同样的事情时,我发现错误仍然发生很奇怪。

这个测试项目——除了node_modules——只有1个页面/views/home/index.ejs,1个控制器/controllers/home.js和1个路由/routes/home.js,但是它们非常简单,它们唯一做的就是引导用户简单页面/views/home/index.ejs,因此错误不能出现在其中之一中。


编辑

错误堆栈跟踪:

[path]\test>npm start

> test@0.0.1 start [path]\test
> node app.js

Testing...
Error: ERR wrong number of arguments for 'set' command
    at JavascriptReplyParser._parseResult ([path]\test\node_modules\redis\lib\parsers\javascript.js:43:16)
    at JavascriptReplyParser.try_parsing ([path]\test\node_modules\redis\lib\parsers\javascript.js:114:21)
    at JavascriptReplyParser.run ([path]\test\node_modules\redis\lib\parsers\javascript.js:126:22)
    at JavascriptReplyParser.execute ([path]\test\node_modules\redis\lib\parsers\javascript.js:107:10)
    at Socket.<anonymous> ([path]\test\node_modules\redis\index.js:131:27)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:146:16)
    at Socket.Readable.push (_stream_readable.js:110:10)
    at TCP.onread (net.js:523:20)

【问题讨论】:

    标签: javascript node.js session express redis


    【解决方案1】:

    更新您的 Redis 服务器版本。

    https://github.com/redis/redis-rb/issues/372

    【讨论】:

    • 感谢您的回复,现在我解决了这个问题。我用的redis是2.5.3版本的,看起来还不错。但是由于某种原因没有目录\connect-redis\node_modules\redis,所以我不知道connect-redis是否试图采用较旧的全局版本的redis或类似的东西,但问题可能是版本connect-redis使用的redis(在connect-redis的package.json中,有“redis”:“^2.1.0”,所以也许它试图使用过时的redis?)。我刚刚删除并再次安装了 connect-redis,它现在具有 2.5.3 版本的 redis 目录。
    猜你喜欢
    • 2012-02-05
    • 1970-01-01
    • 2018-08-04
    • 2017-05-20
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2018-06-30
    • 2014-08-24
    相关资源
    最近更新 更多