我的Windows电脑上Node Redis不起作用,即使服务器已经启动并运行。

8
const express = require("express");
const redis = require("redis");
const app = express();

const client = redis.createClient({
  url: "redis://admin123@ec2-35-182-15-126.ca-central-1.compute.amazonaws.com",
});

client.on("connect", function () {
  console.log("redis connected");
  console.log(`connected ${redisClient.connected}`);
});

client.on("error", (err) => {
  console.log(err);
});

app.listen(process.env.PORT || 3000, () => {
  console.log("Node server started");
});

上述代码没有展示任何与redis服务器的连接,即使我已经通过Redsmin连接到了EC2 redis实例。 Redsmin中的托管详细信息 这是一件非常简单的事情,但是我得到的错误无法通过谷歌搜索解决。

Node服务器启动于C:\Users\Sithira_105661\Desktop\Projects\Learning\Redis\node_modules@node-redis\client\dist\lib\client\index.js:387 return Promise.reject(new errors_1.ClientClosedError()); ^

ClientClosedError: 客户端已关闭 at Commander._RedisClient_sendCommand (C:\Users\Sithira_105661\Desktop\Projects\Learning\Redis\node_modules@node-redis\client\dist\lib\client\index.js:387:31) at Commander.commandsExecutor (C:\Users\Sithira_105661\Desktop\Projects\Learning\Redis\node_modules@node-redis\client\dist\lib\client\index.js:160:154) at Commander.BaseClass. [as set] (C:\Users\Sithira_105661\Desktop\Projects\Learning\Redis\node_modules@node-redis\client\dist\lib\commander.js:8:29) at Object. (C:\Users\Sithira_105661\Desktop\Projects\Learning\Redis\redis.js:19:8) at Module._compile (node:internal/modules/cjs/loader:1101:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10) at Module.load (node:internal/modules/cjs/loader:981:32) at Function.Module._load (node:internal/modules/cjs/loader:822:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) at node:internal/main/run_main_module:17:47

帮我理解这个问题。提前感谢。


你能否先通过以下CLI命令确认服务器是否可达:redis-cli -u redis://<url> - Saurav Kumar
13个回答

28

终于找到了解决方法。我使用的是 node-redis 3.0.0 而不是 4 版本,代码可以正常运行。我不知道为什么最新版的 node-redis 不行。如果有人遇到这个问题,请使用 node-redis 3。


4
谢谢兄弟。我挣扎了三天,差点就要疯了。尽管我做的每件事情都是完全正确的,但它就是不起作用。最后使用“npm i redis@3.1.2”解决了问题。 - malibil
不用谢。我之前也遇到了同样的问题,但幸运地找到了解决方案。 - Codedeyya
我差点把头发都拔光了,非常感谢。 - Alkari
主要版本“3”不支持哈希命令。 - sprash95
该程序相关内容的翻译如下:你真是救了我的命,但这个Redis太痛苦了,别再告诉我们任何东西了。 - Software Engineer

10

我使用了 node-redis 3.1.2 而不是 4,代码可以正常工作。


3
我认为我们不应该将版本从4降低到3。
我们可以使用 -
const redis = require('redis');

const client = redis.createClient();

   
(async () => {
    await client.connect();
})();

client.on('connect', () => console.log('Redis Client Connected'));
client.on('error', (err) => console.log('Redis Client Connection Error', err));

2
请检查您的EC2 Redis连接。
    const client = redis.createClient({
       url: "redis://username:password@ec2_endpoint:port",
     });

连接字符串格式:redis[s]://[[用户名][:密码]@][主机名][:端口号]

2
如果你使用的是redis ^4.0.0版本,你可以这样做:
const { createClient } = require('redis');
const { REDIS_HOST_URL } = require('../config');

const client = createClient({ url: REDIS_HOST_URL });

(async () => {
    await client.connect();
})();

client.on('connect', () => console.log('::> Redis Client Connected'));
client.on('error', (err) => console.log('<:: Redis Client Error', err));

您可以在他们的文档这里阅读更多相关IT技术内容。


2
你正在使用一个非常老的Redis版本,这是Microsoft的一个被放弃的项目,名为OpenTech Redis。
我建议你尝试一下Memurai。Memurai是一个最新的本地Windows端口Redis,它源自该项目(请参见this commit)。
Memurai也提供免费的开发者版。
声明:我在Memurai工作。

1

更改为版本3.1.2

  1. 删除node_modules和package-lock
  2. 打开package.json
  3. 将redis编辑为版本3.1.2并保存
  4. 运行npm install

如果您只想直接安装:

npm i redis@3.1.2

这对我有用。 - PallavSharma
这对我有用。 - undefined

0

0
大部分之前的回答都指向了正确的方向。然而,有一个小的变动让我花了一个小时才弄明白,那就是分号和括号。
错误:

(async () => { client.on('error', (err) => console.log('Redis Client Error', err)); })
    ^
    
TypeError: (intermediate value)(...) is not a function

这是由于nodejs的redis包发生了变化。从4.x.x版本开始,连接数据库的API发生了显著变化。

现在的正确语法是:

(async () => { client.on('error', (err) => console.log('Redis Client Error', err)); })();

立即调用函数表达式(IIFE)需要括号来调用。

PS:现在Node Redis默认为所有函数使用本机Promise,因此asyncawait是必需的。

文档:https://github.com/redis/node-redis/blob/master/docs/v3-to-v4.md


0
在4.0.1版本中,我们必须添加.connect()来运行redis。
他们有迁移指南 这是我的代码,但似乎不能正常工作。
async function connectRedis(){

    try {

        const redisURL = '<link-redis-provider>';

        const client = createClient({
           url: redisURL
        });

        await client.connect();
        console.log('Cache is ready');

    } catch (error) {
       console.log('Connect to cache is failed')
    }
}
module.exports = {connectRedis}

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