【问题标题】:Cant connect to redis in Node.JS无法在 Node.JS 中连接到 redis
【发布时间】:2022-01-13 00:28:57
【问题描述】:

基本上我不知道为什么 node 不会连接到 redis。我可以通过 CLI 连接到它,您可以在下面看到 brew 服务已启动,没有任何错误。我已经提供了所有需要的代码和信息,如果您需要任何其他信息,请告诉我。

节点错误:

(node:6601) UnhandledPromiseRejectionWarning: Error: The client is closed
at Commander._RedisClient_sendCommand (/Users/arialopez/code/url-shortener/node_modules/@node-redis/client/dist/lib/client/index.js:387:31)
at Commander.commandsExecutor (/Users/arialopez/code/url-shortener/node_modules/@node-redis/client/dist/lib/client/index.js:160:154)
at Commander.BaseClass.<computed> [as ping] (/Users/arialopez/code/url-shortener/node_modules/@node-redis/client/dist/lib/commander.js:8:29)
at new AsyncRedis (/Users/arialopez/code/url-shortener/redis/index.js:21:21)
at Object.<anonymous> (/Users/arialopez/code/url-shortener/lib/models.js:3:15)
at Module._compile (internal/modules/cjs/loader.js:1085:14)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
at Module.load (internal/modules/cjs/loader.js:950:32)
at Function.Module._load (internal/modules/cjs/loader.js:790:14)
at Module.require (internal/modules/cjs/loader.js:974:19)

(使用node --trace-warnings ... 显示警告的创建位置) (节点:6601) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志 --unhandled-rejections=strict(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝编号:2) (节点:6601)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

连接代码:

require('dotenv').config();
const redis = require('redis');
const { promisify } = require('util');

const defaultOptions = { // The defaults are being used not env.
    host: process.env.REDIS_HOST || '127.0.0.1',
    port: process.env.REDIS_PORT || 6379,
    keyPrefix: process.env.REDIS_PREFIX || 'url-'
};

class AsyncRedis {
    constructor() {
        this.client = redis.createClient(defaultOptions);
        this.client.on('error', this.error); // error handler defind below
        this.client.ping() // WHERE CODE IS BREAKING
    }
    ... Class code
}

酿造状态:

redis             started

【问题讨论】:

    标签: node.js redis


    【解决方案1】:

    您应该在执行命令之前调用client.connect()。顺便说一句,redis@4.0.0 有内置的 Promise 支持,不需要创建异步包装器

    const redis = require('redis'),
      client = redis.createClient({
        // ...
      });
    
    client.on('error', err => {
      // ...
    });
    
    await client.connect();
    console.log(await client.ping());
    

    【讨论】:

      猜你喜欢
      • 2019-12-10
      • 2022-06-24
      • 2021-02-15
      • 2018-07-12
      • 2022-01-26
      • 1970-01-01
      • 2015-02-06
      • 2023-02-10
      相关资源
      最近更新 更多