首页 文章

NodeJs - 使用redis,connect-redis和express

提问于
浏览
11

NOTE For those struggling with Redis, the Redis server has to be launched. On windows, there is a redis distribution, check out the following link: https://github.com/dmajkic/redis/downloads then start the server by launching "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上开发

3 回答

  • 4

    看起来你没有运行redis服务器 . 您对redis.io/download有一个很好的解释,关于如何下载,安装和运行服务器和客户端 .

  • 13

    代码提供很好,只是配置错误 . 所有需要更改的是端口号 .

    例如,当设置与redis存储的连接时,就会告诉应用程序Redis服务器所在的位置以及它正在侦听的端口 . 也可以将端口指令全部放在一起,connect-redis将使用远程redis服务器的默认端口 .

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

    更改:

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

    新:

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

    更新:

    我忘了声明命令 netstatpingtelnet 可以帮助人们调试哪些端口在本地打开以及服务返回给应用程序的内容 . 如果您在Linux,OSX或BSD等unix环境中,这两个命令将在cmd.exe / powershell和bash下执行 .

    这方面的一个例子是以下内容:

    视窗:

    netstat -np tcp | find "3000"
    
    netstat -np tcp | find "6379"
    

    Linux的:

    netstat -nlt | grep '3000\|6379'
    

    这样做是为localhost:3000或localhost:6379报告本地打开的端口 . 如果您使用远程系统,那么您将使用ping来查看服务器是否已启动以及如nmap的portscanner来发现可用的远程端口 .

    完成所有这些后,您将使用以下命令启动连接:

    telnet <host> 3000
    telnet <host> 6379
    

    请记住,仅仅因为一个人用网络语言进行编程并不意味着一个人也没有学习网络的技术目的 .

  • 0

    除了提到的内容之外,我想添加 express.session{..} 抛出错误,因为会话已经超出了快递核心 .

    Error('Most middleware (like ' + name + ') is no longer bundled with Express an....
    

    解决方案:添加

    var session = require('express-session');

    并使用普通 session 而不是 express.session

相关问题