docker-compose 后无法向我的 express API w/redis 发送请求
Cannot send requests to my express API w/ redis after docker-compose
我一直在用 Node.js/Express + redis 做一个小项目,有基本的前端 w/o 任何框架(完整代码可以看 here)。我一直在使用 Postman 测试我的 API(因为我的前端目前无法正常工作),它的效果非常好。
所以,在项目中实现 redis 之后,我尝试将它添加到我的 docker-compose.yml 文件中,这里是它和一些其他文件:
docker-compose.yml
version: '3.8'
services:
redis:
container_name: redis-db
image: redis
networks:
- webnet
backend:
container_name: api
build: ./backend
restart: always
ports:
- '8080:8080'
networks:
- webnet
depends_on:
- redis
frontend:
container_name: frontend
build: ./frontend
restart: always
ports:
- '5000:5000'
networks:
- webnet
depends_on:
- backend
networks:
webnet:
config.yml
server:
host: localhost
port: 8080
app:
# '-1' for turning expiry off; otherwise, should be at least '1' (minute)
timeToLive: -1
db:
type: redis # ['in-memory', 'redis']
redis:
# select 'redis' if using docker-compose
host: redis # ['localhost', 'redis']
port: 6379
redis.js
import Redis from 'redis';
import config from 'config';
import AppError from '../utils/appError.js';
import { StatusCodes } from 'http-status-codes';
import { promisify } from 'util';
export const redisClient = Redis.createClient({
host: config.get('db.redis.host'),
port: config.get('db.redis.port'),
});
redisClient.on('error', function (err) {
throw new AppError(err, StatusCodes.INTERNAL_SERVER_ERROR);
});
redisClient.on('connect', () => {
console.log(' connected redis successfully ');
});
但是,不幸的是,在 docker-compose 之后,我无法再发出 Postman 请求。 Redis 连接没有任何问题,在控制台中似乎一切正常,我什至可以访问我的前端页面,但我无法再向我的后端发出请求。
我的前端是 运行 localhost:5000,后端应该是 运行 localhost:8080,redis 似乎是 运行 [=53] =].
我已经尽力寻找答案,但是有数百个关于如何使用 docker-compose 将 redis 连接到您的 express 项目的问题,但没有关于连接 redis 后访问后端的问题的问题.
EDIT_1:这是邮递员说的:
POST http://127.0.0.1:8080/api/v1/queue
Error: socket hang up
Request Headers
Content-Type: application/json
User-Agent: PostmanRuntime/7.28.3
Accept: */*
Postman-Token: a61d8b9c-a2f5-4fe4-92e1-921a5680bb85
Host: 127.0.0.1:8080
Accept-Encoding: gzip, deflate, br
这里是dockerps输出:
f7f6fbe12863 project1_frontend "docker-entrypoint.s…" 3 minutes ago Up 2 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp frontend
9802680a1a3d project1_backend "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp api
66fde12be888 redis "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis-db
这是 docker-compose up 后我的控制台日志:
api |
api | > queue-resolution-api@0.1.0 start /app
api | > nodemon server.js
api |
api | [nodemon] 2.0.12
api | [nodemon] to restart at any time, enter `rs`
api | [nodemon] watching path(s): *.*
api | [nodemon] watching extensions: js
api | [nodemon] starting `node server.js`
api | NODE_ENV: development
api | Listening on port 8080...
api | connected redis successfully
redis-db | 1:C 16 Aug 2021 14:35:18.728 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis-db | 1:C 16 Aug 2021 14:35:18.728 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=1, just started
redis-db | 1:C 16 Aug 2021 14:35:18.728 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis-db | 1:M 16 Aug 2021 14:35:18.728 * monotonic clock: POSIX clock_gettime
redis-db | 1:M 16 Aug 2021 14:35:18.729 * Running mode=standalone, port=6379.
redis-db | 1:M 16 Aug 2021 14:35:18.729 # Server initialized
redis-db | 1:M 16 Aug 2021 14:35:18.729 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis-db | 1:M 16 Aug 2021 14:35:18.729 * Ready to accept connections
redis-db | 1:M 16 Aug 2021 14:35:20.587 * DB saved on disk
frontend |
frontend | > frontend@1.0.0 start /app
frontend | > nodemon server.js
frontend |
frontend | [nodemon] 2.0.12
frontend | [nodemon] to restart at any time, enter `rs`
frontend | [nodemon] watching path(s): *.*
frontend | [nodemon] watching extensions: js,mjs,json
frontend | [nodemon] starting `node server.js`
frontend | Listening on port 5000...
我找到答案了。在我的 server.js 文件中,我一直在强制应用程序在 host = localhost 上侦听,删除主机部分后一切都开始工作了。
app.listen(port, host, () => {
console.log('NODE_ENV: ' + config.util.getEnv('NODE_ENV'));
console.log(`Listening on port ${port}...`);
});
我一直在用 Node.js/Express + redis 做一个小项目,有基本的前端 w/o 任何框架(完整代码可以看 here)。我一直在使用 Postman 测试我的 API(因为我的前端目前无法正常工作),它的效果非常好。
所以,在项目中实现 redis 之后,我尝试将它添加到我的 docker-compose.yml 文件中,这里是它和一些其他文件:
docker-compose.yml
version: '3.8'
services:
redis:
container_name: redis-db
image: redis
networks:
- webnet
backend:
container_name: api
build: ./backend
restart: always
ports:
- '8080:8080'
networks:
- webnet
depends_on:
- redis
frontend:
container_name: frontend
build: ./frontend
restart: always
ports:
- '5000:5000'
networks:
- webnet
depends_on:
- backend
networks:
webnet:
config.yml
server:
host: localhost
port: 8080
app:
# '-1' for turning expiry off; otherwise, should be at least '1' (minute)
timeToLive: -1
db:
type: redis # ['in-memory', 'redis']
redis:
# select 'redis' if using docker-compose
host: redis # ['localhost', 'redis']
port: 6379
redis.js
import Redis from 'redis';
import config from 'config';
import AppError from '../utils/appError.js';
import { StatusCodes } from 'http-status-codes';
import { promisify } from 'util';
export const redisClient = Redis.createClient({
host: config.get('db.redis.host'),
port: config.get('db.redis.port'),
});
redisClient.on('error', function (err) {
throw new AppError(err, StatusCodes.INTERNAL_SERVER_ERROR);
});
redisClient.on('connect', () => {
console.log(' connected redis successfully ');
});
但是,不幸的是,在 docker-compose 之后,我无法再发出 Postman 请求。 Redis 连接没有任何问题,在控制台中似乎一切正常,我什至可以访问我的前端页面,但我无法再向我的后端发出请求。
我的前端是 运行 localhost:5000,后端应该是 运行 localhost:8080,redis 似乎是 运行 [=53] =].
我已经尽力寻找答案,但是有数百个关于如何使用 docker-compose 将 redis 连接到您的 express 项目的问题,但没有关于连接 redis 后访问后端的问题的问题.
EDIT_1:这是邮递员说的:
POST http://127.0.0.1:8080/api/v1/queue
Error: socket hang up
Request Headers
Content-Type: application/json
User-Agent: PostmanRuntime/7.28.3
Accept: */*
Postman-Token: a61d8b9c-a2f5-4fe4-92e1-921a5680bb85
Host: 127.0.0.1:8080
Accept-Encoding: gzip, deflate, br
这里是dockerps输出:
f7f6fbe12863 project1_frontend "docker-entrypoint.s…" 3 minutes ago Up 2 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp frontend
9802680a1a3d project1_backend "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp api
66fde12be888 redis "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis-db
这是 docker-compose up 后我的控制台日志:
api |
api | > queue-resolution-api@0.1.0 start /app
api | > nodemon server.js
api |
api | [nodemon] 2.0.12
api | [nodemon] to restart at any time, enter `rs`
api | [nodemon] watching path(s): *.*
api | [nodemon] watching extensions: js
api | [nodemon] starting `node server.js`
api | NODE_ENV: development
api | Listening on port 8080...
api | connected redis successfully
redis-db | 1:C 16 Aug 2021 14:35:18.728 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis-db | 1:C 16 Aug 2021 14:35:18.728 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=1, just started
redis-db | 1:C 16 Aug 2021 14:35:18.728 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis-db | 1:M 16 Aug 2021 14:35:18.728 * monotonic clock: POSIX clock_gettime
redis-db | 1:M 16 Aug 2021 14:35:18.729 * Running mode=standalone, port=6379.
redis-db | 1:M 16 Aug 2021 14:35:18.729 # Server initialized
redis-db | 1:M 16 Aug 2021 14:35:18.729 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis-db | 1:M 16 Aug 2021 14:35:18.729 * Ready to accept connections
redis-db | 1:M 16 Aug 2021 14:35:20.587 * DB saved on disk
frontend |
frontend | > frontend@1.0.0 start /app
frontend | > nodemon server.js
frontend |
frontend | [nodemon] 2.0.12
frontend | [nodemon] to restart at any time, enter `rs`
frontend | [nodemon] watching path(s): *.*
frontend | [nodemon] watching extensions: js,mjs,json
frontend | [nodemon] starting `node server.js`
frontend | Listening on port 5000...
我找到答案了。在我的 server.js 文件中,我一直在强制应用程序在 host = localhost 上侦听,删除主机部分后一切都开始工作了。
app.listen(port, host, () => {
console.log('NODE_ENV: ' + config.util.getEnv('NODE_ENV'));
console.log(`Listening on port ${port}...`);
});