NodeJs - использование redis, connect-redis с экспресс

Примечание Для тех, кто борется с Redis, сервер Redis должен быть запущен. На окнах есть 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

Экспресс начинает прослушивать порт 3000, чего я ожидаю. Сообщение об ошибке redis упоминает соединение на порту 6379. Это происходит, если я передаю redisClient в RedisStore, что я и понял, чтобы связать redis и RedisStore.

Я разрабатываю Windows

Ответ 1

Похоже, что у вас нет сервера redis. У вас есть хорошее объяснение redis.io/download о том, как загрузить, установить и запустить сервер и клиент.

Ответ 2

Предоставление кода в порядке, просто настроено неправильно. Все, что нужно изменить, это номер порта.

Например, когда вы собираетесь установить соединение с Redis Storage, вы указываете приложение, в котором находится сервер Redis, и на каком порту он прослушивает. Также можно отключить директиву портов, а connect-redis будет использовать порт по умолчанию для удаленного сервера redis.

В этом случае я бы предложил попробовать этот фрагмент кода:

Изменить:

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

Новое:

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

UPDATE:

Я забыл указать, что команды netstat, ping и telnet могут помочь отлаживать, какие порты открыты локально и что служба возвращается в приложение. Эти две команды будут выполняться в cmd.exe/powershell и под bash, если вы в среде unix, такой как Linux, OSX или BSD.

Примером этого может быть следующее:

Окна:

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

В дополнение к тому, что упоминается, я хотел бы добавить express.session{..} вызывает следующую ошибку, поскольку сеанс отключен от явного ядра.

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

Решение: добавить

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

И используйте обычный session вместо express.session