docker-compose.yml大概是这样的:

version : "3"
services:
  irbredis:
    image: redis:7.2.2-alpine
    container_name: irbredis
  irbserver:
    image: node:20.9.0-alpine
    container_name: irbserver
    depends_on:
      - irbredis

在node.js容器中的某个位置,我得到了以下内容:

const redis = require('redis');
const rclient = redis.createClient({ url: "redis://irbredis:6379" });

Redis服务器肯定在运行,我可以从docker-compose中expose 端口,并go URL判断日志(log).但是从node.js代码中,我得到了错误日志(log):


irbserver  | Error: The client is closed
irbserver  |     at Commander._RedisClient_sendCommand (/app/node_modules/@redis/client/dist/lib/client/index.js:494:31)
irbserver  |     at Commander.commandsExecutor (/app/node_modules/@redis/client/dist/lib/client/index.js:189:154)
irbserver  |     at BaseClass.<computed> [as get] (/app/node_modules/@redis/client/dist/lib/commander.js:8:29)
irbserver  |     at Object.get (/app/node_modules/connect-redis/dist/cjs/index.js:20:34)
irbserver  |     at RedisStore.get (/app/node_modules/connect-redis/dist/cjs/index.js:53:42)
irbserver  |     at session (/app/node_modules/express-session/index.js:485:11)
irbserver  |     at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
irbserver  |     at trim_prefix (/app/node_modules/express/lib/router/index.js:328:13)
irbserver  |     at /app/node_modules/express/lib/router/index.js:286:9
irbserver  |     at Function.process_params (/app/node_modules/express/lib/router/index.js:346:12)

我做错了什么?


更多上下文/node.js代码:

redisFunc.js

const redis = require('redis');
const rclient = redis.createClient({ url: "redis://irbredis:6379" });

module.exports =
{
    rclient : rclient
}

它被用在 sessionMW.js:

const session    = require('express-session');
const RedisStore = require('connect-redis').default;

module.exports =
session
(
    {
        store: new RedisStore({ client : require('./redisFunc.js').rclient }),
        //...
    }
);

它在index.js中使用

const express = require('express');
const app     = express();   

app.use(express.urlencoded({ extended: true }));
app.use(express.json());

app.use(require('./sessionMW.js'));
//...

版本:

"connect-redis": "^7.1.0",
"express": "^4.18.2",
"express-session": "^1.17.3",
"redis": "^4.6.10",

推荐答案

使用docker-compose网络(或一般的docker),您需要做的第一件事通常是公开必要的容器端口.在本例中,您希望默认网络上的容器能够访问irbredis容器上的端口6379,因此您需要(至少)添加以下内容

    expose:
      - "6379"

irbredis服务的配置(当然有多种 Select ,当然包括expose 主机上的那些端口).

在这一点上,如果您仍然收到连接关闭的问题(并且您可以验证网络已启动并且可以从应用程序容器内访问,这通常涉及在该容器中运行交互式shell 并向该端口发送ping),接下来要查看的是应用程序代码中的错误(例如,忘记连接,或try 在连接准备好之前使用连接).

Javascript相关问答推荐

用相器进行向内碰撞检测

如何获取转换字节的所有8位?

在页面上滚动 timeshift 动垂直滚动条

Cookie中未保存会话数据

WebRTC关闭navigator. getUserMedia正确

在观察框架中搜索CSV数据

给定一个凸多边形作为一组边,如何根据到最近边的距离填充里面的区域

Prisma具有至少一个值的多对多关系

为什么我的导航条打开状态没有在窗口addeventlistener(Reaction Js)中更新?

提交链接到AJAX数据结果的表单

try 使用javascript隐藏下拉 Select

Web Crypto API解密失败,RSA-OAEP

创建以键值对为有效负载的Redux Reducer时,基于键的类型检测

同一类的所有div';S的模式窗口

如果一个字符串前面有点、空格或无字符串,后面有空格、连字符或无字符串,则匹配正则表达式

令牌JWT未过期

FileReader()不能处理Firefox和GiB文件

我正在试着做一个TicTacToe Ai来和我玩.但是,我试着在第一个方块被点击时出现一个X,然后在第二个方块之后出现一个O

我不知道如何纠正这一点.

react 路由如何使用从加载器返回的数据