node.js - 提供 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' ]
解决方案
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: {}})
进一步阅读/来源:
推荐阅读
- wordpress - SimplePie 错误 - Wordpress 上的 Curl 超时
- javascript - 尝试使用 VideoJS、VideoJS-YouTube、VideoJS-Playlist 和 VideoJS-Playlist-UI
- c# - 每个条目中具有不同维度的锯齿状整数数组
- r - 如何将 R Studio 连接到 Tableau?
- dc.js - dc.js HeatMap crossfilter 灰色未选中
- javascript - 邮递员发布请求有效,但 ajax 发布无效。一遍又一遍地检查客户端js
- python - GeoPandas 跨笔记本丢失 .crs 信息
- unity-container - 如何按约定注册一个实现两个接口的类?
- java - IntelliJ 可运行 jar 在其他计算机上不起作用
- javascript - 在 chrome 中使用高 CPU 的画布