NodeJs - 使用redis和connect-redis与express配合使用

12

注意:对于那些在使用Redis时遇到困难的人,必须启动Redis服务器。在Windows上,有一个Redis分发版,请查看以下链接:https://github.com/dmajkic/redis/downloads,然后通过启动“redis-server.exe”来启动服务器。

我正在跟随Node.js教程。该教程使用Express和Redis。我安装了Redis和connect-redis(它们在package.json中被引用):

npm install redis connect-redis --save

在我的 server.js 文件中(仅提供有意义的部分):

var express = require('express');
var http = require('http');
var app = module.exports = express();
var RedisStore = require('connect-redis')(express);

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

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  console.log('views', __dirname + '/views');
  app.set('view engine', 'jade'); //jade as template engine
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser());
  app.use(express.session({
      secret: "kqsdjfmlksdhfhzirzeoibrzecrbzuzefcuercazeafxzeokwdfzeijfxcerig",
      store: new RedisStore({ host: 'localhost', port: 3000, client: redis })
  }));
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

错误信息:

Express server listening on port 3000
[ERROR] Error
Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED
    at RedisClient.on_error (D:\Programming\Screencasts\peepcode\nodejs\peepcode
-069-full-stack-nodejs-i-mov\code\roland\HotPie\node_modules\redis\index.js:140:
24)
    at Socket.<anonymous> (D:\Programming\Screencasts\peepcode\nodejs\peepcode-0
69-full-stack-nodejs-i-mov\code\roland\HotPie\node_modules\redis\index.js:74:14)

    at Socket.EventEmitter.emit (events.js:88:17)
    at Socket._destroy.self.errorEmitted (net.js:329:14)
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)
[ERROR] Error
Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED
    at RedisClient.on_error (D:\Programming\Screencasts\peepcode\nodejs\peepcode
-069-full-stack-nodejs-i-mov\code\roland\HotPie\node_modules\redis\index.js:140:
24)
    at Socket.<anonymous> (D:\Programming\Screencasts\peepcode\nodejs\peepcode-0

Express开始监听3000端口,这正是我所期望的。Redis错误消息提到了在6379端口上的连接。如果我将redisClient传递给RedisStore,那么就会出现这种情况,这是我理解的将redis和RedisStore绑定所做的。

我正在Windows上开发。


1
Redis服务器在这台机器上运行吗?您可以使用redis-cli手动连接并检查它是否正在运行吗? - Didier Spezia
我按照作者的建议执行了 simple.js(node simple.js),但是出现了错误: Error: Redis 连接 127.0.0.1:6379 失败 - 连接被拒绝。Error: Redis 连接 127.0.0.1:6379 失败 - 连接被拒绝。 - roland
如何启动Redis?我没想到在安装完后还需要做额外的事情。 - roland
2
请访问 http://redis.io/download 下载 Redis。使用以下命令运行 Redis:$ src/redis-server - JohnnyHK
3个回答

13

提供的代码没问题,只是配置错误。需要更改的只有端口号。

例如,当您设置与redis存储的连接时,您告诉应用程序Redis服务器位于何处以及它在哪个端口上侦听。您还可以完全删除端口指令,并且connect-redis将使用远程redis服务器的默认端口。

在这种情况下,我建议尝试此代码片段:

更改为:

store: new RedisStore({ ..., port: 3000, ... })

新闻:

store: new RedisStore({..., port: 6379, ... })

更新:

我忘记说明命令netstatpingtelnet可以帮助人们调试本地开放的端口以及服务返回给应用程序的内容。这两个命令将在cmd.exe/powershell中执行,如果您在像Linux、OSX或BSD这样的Unix环境下,则会在bash下执行。

一个例子是执行以下操作:

Windows:

netstat -np tcp | find "3000"

netstat -np tcp | find "6379"

Linux:

netstat -nlt | grep '3000\|6379'

这个操作会报告本地打开的端口,可以是localhost:3000或者localhost:6379。如果你正在使用远程系统,则可以使用ping命令来检查服务器是否正常运行,并使用类似nmap的端口扫描器来发现可用的远程端口。

接下来,您需要使用以下方法来建立连接:

telnet <host> 3000
telnet <host> 6379

记住,仅仅因为在编程时使用了一种网络语言,并不意味着不能学习网络技术的技术方面。


3

看起来您没有运行Redis服务器。在redis.io/download上有详细的说明,如何下载、安装和运行服务器和客户端。


0
除了已经提到的内容,我想补充一下:由于session不再是express核心的一部分,express.session{..}会抛出以下错误。
Error('Most middleware (like ' + name + ') is no longer bundled with Express an....

解决方案: 添加以下代码: var session = require('express-session'); 然后使用纯粹的 session 替代 express.session

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接