A_T*_*A_T 2 redis node.js express docker econnrefused
我正在遵循 youtube 上的教程,在 Express、Node.js、Mongo 和 Redis 中创建一个简单的 dockerized CRUD 应用程序。我停留在关于使用会话和 Redis 进行身份验证的视频 3:06:57。
我发送 POST 时遇到的最初问题如下
ClientClosedError: The client is closed
at Commander._RedisClient_sendCommand (/app/node_modules/@node-redis/client/dist/lib/client/index.js:408:31)
at Commander.commandsExecutor (/app/node_modules/@node-redis/client/dist/lib/client/index.js:166:154)
at Commander.BaseClass.<computed> [as set] (/app/node_modules/@node-redis/client/dist/lib/commander.js:8:29)
at RedisStore.set (/app/node_modules/connect-redis/lib/connect-redis.js:65:21)
at Session.save (/app/node_modules/express-session/session/session.js:72:25)
at Session.save (/app/node_modules/express-session/index.js:406:15)
at ServerResponse.end (/app/node_modules/express-session/index.js:335:21)
at ServerResponse.send (/app/node_modules/express/lib/response.js:221:10)
at ServerResponse.json (/app/node_modules/express/lib/response.js:267:15)
at exports.login (/app/controllers/authController.js:45:28)
[nodemon] app crashed - waiting for file changes before starting...
Run Code Online (Sandbox Code Playgroud)
我发现上面的问题是由于Redis版本引起的,如果没有记错的话,教程视频使用的是Redis 3.0+,但我使用的是Redis 6.0+。所以我添加了这一行,redisClient.connect().catch(console.error);但发生了第二个问题。
Error: connect ECONNREFUSED 127.0.0.1:6379
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1138:16) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 6379
}
Run Code Online (Sandbox Code Playgroud)
源文件如下:
index.js:
const express = require("express");
const mongoose = require("mongoose");
const session = require("express-session");
const redis = require("redis");
let RedisStore = require("connect-redis")(session);
const { MONGO_PASSWORD, MONGO_IP, MONGO_PORT, MONGO_USER, REDIS_URL, REDIS_PORT, SESSION_SECRET } = require("./config/config");
let redisClient = redis.createClient({
host: REDIS_URL,
port: REDIS_PORT,
})
// let redisClient = createClient({
// host: REDIS_URL,
// port: REDIS_PORT
// });
//redisClient.connect().catch(console.error);
redisClient.on('error', err => {console.log('Error ' + err);});
Run Code Online (Sandbox Code Playgroud)
docker-compose.yml:
version : "3"
services :
node-app:
build : .
ports:
- "3000:3000"
environment:
- PORT=3000
depends_on:
- mongo
mongo:
image: mongo
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=password
volumes:
- mongo-db:/data/db
redis:
image: redis
volumes:
mongo-db:
Run Code Online (Sandbox Code Playgroud)
docker-compose.dev.yml:
version : "3"
services :
node-app:
build:
context: .
args:
NODE_ENV: development
volumes:
- ./:/app
- /app/node_modules
environment:
- NODE_ENV=development
- MONGO_USER=admin
- MONGO_PASSWORD=password
- SESSION_SECRET=secret
command: npm run dev
mongo:
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=password
Run Code Online (Sandbox Code Playgroud)
config.js:
module.exports = {
MONGO_IP: process.env.MONGO_IP || "mongo",
MONGO_PORT: process.env.MONGO_PORT || 27017,
MONGO_USER: process.env.MONGO_USER,
MONGO_PASSWORD: process.env.MONGO_PASSWORD,
REDIS_URL: process.env.REDIS_URL || "redis",
REDIS_PORT: process.env.REDIS_PORT || 6379,
SESSION_SECRET: process.env.SESSION_SECRET
}
Run Code Online (Sandbox Code Playgroud)
我检查了 redis 容器日志,它已启动并正在运行。它还应该与节点应用程序位于同一网络中。
码头命令:docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
来自导师的完整源代码https://github.com/Sanjeev-Thiyagarajan/node-docker
小智 13
Redis 客户端在 Redis v4 中不起作用。将 redisClient 代码替换为:
let redisClient = redis.createClient({
legacyMode: true,
socket: {
port: REDIS_PORT,
host: REDIS_URL
}
})
redisClient.connect().catch(console.error)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9960 次 |
| 最近记录: |