首页 > 解决方案 > 提供 Redis AbortError 的托管 DigitalOcean Redis 实例

问题描述

我在数字海洋上设置了托管 redis 和托管 postgres。数字海洋给了我一个.crt文件,我不知道怎么处理,所以没怎么处理。这可能是以下问题的根源:

或者我是否必须允许 docker 容器到达rediss协议上的容器外部?

我将一个节点应用程序 docker 化,然后将这个容器放到我的 droplet 上。我在同一区域(SFO2)有我的 droplet 和托管的 redis 和 postgres。它使用这个 url 连接到 redis:

url: 'rediss://default:REMOVED_THIS_PASSWORD@my-new-app-sfo2-do-user-5053627-0.db.ondigitalocean.com:25061/0',

然后我确实用docker run.

然后它给了我错误:

node_redis: WARNING: You passed "rediss" as protocol instead of the "redis" protocol!

events.js:186
      throw er; // Unhandled 'error' event
      ^
AbortError: Connection forcefully ended and command aborted. It might have been processed.
    at RedisClient.flush_and_error (/opt/apps/mynewapp/node_modules/redis/index.js:362:23)
    at RedisClient.end (/opt/apps/mynewapp/node_modules/redis/lib/extendedApi.js:52:14)
    at RedisClient.onPreConnectionEnd (/opt/apps/mynewapp/node_modules/machinepack-redis/machines/get-connection.js:157:14)
    at RedisClient.emit (events.js:209:13)
    at RedisClient.connection_gone (/opt/apps/mynewapp/node_modules/redis/index.js:590:14)
    at Socket.<anonymous> (/opt/apps/mynewapp/node_modules/redis/index.js:293:14)
    at Object.onceWrapper (events.js:298:28)
    at Socket.emit (events.js:214:15)
    at endReadableNT (_stream_readable.js:1178:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21)
Emitted 'error' event on RedisClient instance at:
    at /opt/apps/mynewapp/node_modules/redis/index.js:310:22
    at Object.callbackOrEmit [as callback_or_emit] (/opt/apps/mynewapp/node_modules/redis/lib/utils.js:89:9)
    at Command.callback (/opt/apps/mynewapp/node_modules/redis/lib/individualCommands.js:199:15)
    at RedisClient.flush_and_error (/opt/apps/mynewapp/node_modules/redis/index.js:374:29)
    at RedisClient.end (/opt/apps/mynewapp/node_modules/redis/lib/extendedApi.js:52:14)
    [... lines matching original stack trace ...]
    at processTicksAndRejections (internal/process/task_queues.js:80:21) {
  code: 'NR_CLOSED',
  command: 'AUTH',
  args: [ 'REMOVED_I_DONT_KNOW_IF_THIS_IS_SENSITIVE' ]

标签: node.jsdockerredissails.jsdigital-ocean

解决方案


redis协议不同,因为rediss后者使用 TLS 连接。DigitalOcean Managed Redis需要通过 TLS 建立连接,因此您必须使用rediss. 但是,我找不到任何有关 DigitalOcean 提供的用于连接托管 Redis 服务的 TLS 证书的信息。

根据您的错误消息,我推测您正在使用这个 redis 包。如果是这种情况,您可以在连接字符串中传递空的 TLS 对象选项,如下所示:

const Redis = require('redis')

const host = 'db-redis.db.ondigitalocean.com'
const port = '25061'
const username = 'user'
const password = 'secret'
const url = `${username}:${password}@${host}:${port}`

const client = Redis.createClient(url, {tls: {}})

进一步阅读/来源:

  1. SSL 连接到达 Compose 上的 Redis
  2. 从 Node.js 连接到 IBM Cloud Databases for Redis

推荐阅读