我试图做一个简单的nodesjs应用程序,使用docker显示现有mongodb数据库中的整个集合,我已经创建了nodejs应用程序并将其对接,我还创建了一个网络,其中包括nodesjs应用程序和现有mongodb数据库的容器。连接已成功建立,但由于某种原因,我没有得到任何结果。你可以在下面找到我用来构建我的简单应用的代码:
我尝试连接的数据库名为crawlab_test,而我试图在nodejs应用程序上显示的集合名为resultnews。
(当我访问http://localhost:5001/时,我得到的结果是无法获取/但当我尝试使用我的nodejs应用程序访问http://localhost:5001/resultnews以显示集合时,我什么也得不到。)
我的server.js文件:
const Resultnews = require("./src/Resultnews.model");
const express = require("express");
const app = express();
const connectDb = require("./src/connection");
const PORT = 5001;
app.get("/resultnews", async (req, res) => {
const resultnews = await resultnews.find();
res.json(resultnews);
});
app.listen(PORT, function () {
console.log(`Listening on ${PORT}`);
connectDb().then(() => {
console.log("MongoDb connected");
});
});我在其中创建了一个名为src的文件夹,并创建了两个文件:
我的Resultnews.model.js:
const mongoose = require("mongoose");
const resultnewsSchema = new mongoose.Schema({
title: String,
url: String,
clicks: String,
task_id: String,
});
const Resultnews = mongoose.model("Resultnews", resultnewsSchema);
module.exports = Resultnews;和我的connection.js文件:
// connection.js
const mongoose = require("mongoose");
const User = require("./Resultnews.model");
const connection = "mongodb://localhost:27017/crawlab_test";
const connectDb = () => {
return mongoose.connect(connection, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
};
module.exports = connectDb;下面是我使用的Dockerfile:
FROM node:12
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
COPY package*.json ./
RUN npm install
# Copy app source code
COPY . .
#Expose port and start application
EXPOSE 5001
CMD [ "npm", "start" ]我在这个项目上使用的docker命令是:
docker network create enews创建网络,
docker network connect crawlab_mongo_1将已有的mongodb容器添加到我的网络中。
docker build -f Dockerfile -t mydockerapp从我的nodejs应用程序构建一个容器,最后
docker运行-d --net=enews --name mydockerapp -p 5001:5001以运行容器并添加到我的网络中。
ps :这个应用程序在使用本地mongodb数据库时运行得很好,所以我猜问题出在我的docker run命令上,但我似乎找不到它。对于可能帮助我解决这个问题的每个人,我要提前感谢你们。
发布于 2020-04-20 17:09:54
因为它是const Resultnews = require("./src/Resultnews.model");
但在app.get()中的结果是resultnews。
一个以大写字母开头,另一个以小写字母开头。
更新:
当在Docker for Win或Docker for Mac上运行时,您可以在容器中使用主机名host.docker.internal来访问主机上的资源: host.docker.internal:27017
在Linux上似乎没有这样的功能。但是,存在一些解决方法,您可以在此问题中找到:https://github.com/docker/for-linux/issues/264
查看这篇文章:https://www.reddit.com/r/docker/comments/a0ge2d/accessing_mongodb_from_docker_container/
https://stackoverflow.com/questions/61312018
复制相似问题