node.js - 如何让 docker 下运行的 nodejs 服务器通过 mongoose 连接到 mongodb?
问题描述
我正在努力尝试通过 mongoose 将我的 nodejs 服务器(在 docker 容器中运行)连接到 mongodb
server.js:
import * as express from 'express';
import { Request, Response } from 'express';
import { encode } from 'jwt-simple';
import * as bcrypt from 'bcrypt';
import { connect } from 'mongoose';
import { UserModel, User } from './models';
const app: express.Application = express();
const PORT = 3333;
app.use(express.json());
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*")
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
next();
});
// some code here
connect(`mongodb://0.0.0.0:27017/user-db`, {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => {
console.log('successfully connected to the database');
})
.catch(err => {
console.log('error connecting to the database');
process.exit();
});
app.listen(PORT, () => {
console.log(`Server is listening at port - ${PORT}`);
});
然后我有两个图像,一个用于服务器,一个用于 mongodb,在运行 mongodb 图像后,我运行服务器一个,它被服务(已经从 .ts 编译)到 docker,然后我运行:
1 docker run -it --name server -p 3333:3333 my:server sh
然后在“服务器”容器中运行:
2 node server.js
服务器路由工作正常,但几秒钟后mongoose.connect
陷入困境
解决方案
您有两个选项可以连接 Mongo DB 容器。
- 主机 IP(运行 Mongo DB 容器的位置)
- 相同的 Docker 网络
对于第一个选项,您可以将Host IP
作为环境变量传递给您的 nodejs 容器,因为这0.0.0.0
意味着 @David 提到的所有接口在这种情况下都不起作用。进行以下更改
// set some default value if ENV is not set
const mongo_host=process.env.MONGO_HOST || "localhost"
connect(mongo_host, {
useNewUrlParser: true,
useUnifiedTopology: true
})
然后运行容器并传递 Mongo 主机 IP
docker run -it -e MONGO_HOST=192.168.x.x --name server -p 3333:3333 my:server sh
或者如果主机是 Mac 或窗口,你也使用特殊的 DNShost.docker.internal
connect('host.docker.internal', {
useNewUrlParser: true,
useUnifiedTopology: true
})
- 第二个选项是 Docker 网络
version: "3"
services:
app:
container_name: nodejs-mongo
image: nodejs_app
environment:
- MONGO_HOST=mongo
ports:
- "3000:3000"
depends_on:
- mongo
mongo:
container_name: mongo
image: mongo
ports:
- "27017:27017"
在这种情况下,我们通过MONGO_HOST=mongo
哪个 docker 可以解决这个问题,以便与同一网络中的 Mongo 容器连接。
推荐阅读
- typescript - 使用 vscode 的打字稿环境无效
- excel - 第一次迭代后运行总计不正确
- python - 如何显示行中具有不同值的列?
- asp.net - ASP.NET 单元测试 - 在单元测试中模拟 ILogger
- php - PHP Xdebug 超时连接到客户端(Docker、VSCode、Ubuntu)
- docker - 确定为什么 docker 镜像无法在 swarm 模式下运行,但可以通过 compose 使用相同的 yml 文件
- .net - 嵌套的 NuGet 包依赖项未正确还原
- sql - 一个查询中一个表中两个行的求和之间的 SUBTRACTION
- html - 如何在反应中渲染多个组件?
- python - RNN 产生非常短的结果的原因可能是什么?