我正在尝试从NodeJS Docker容器连接到MongoDB Docker容器。我可以从RoboMongo等客户端访问MongoDb。
但是在NodeJS中,它连接到数据库,但db为null,我在尝试获取集合时遇到错误。
url = 'mongodb://127.0.0.1:27017/mydb';
router.get('/api/v1/test', function (req, res, next) {
MongoClient.connect(url, function(err, db) {
var collection = db.collection('myApptbl');
});
});
我在docker日志中收到以下错误。
/usr/src/myapp/node_modules/mongodb/lib/mongo_client.js:225
throw err
^
TypeError: Cannot read property 'collection' of null
at /usr/src/myapp/server.js:52:26
at connectCallback (/usr/src/app/node_modules/mongodb/lib/mongo_client.js:315:5)
at /usr/src/myapp/node_modules/mongodb/lib/mongo_client.js:222:11
at _combinedTickCallback (internal/process/next_tick.js:67:7)
at process._tickCallback (internal/process/next_tick.js:98:9)
您能否提供帮助或提供有关我收到此错误的原因的建议。
答案 0 :(得分:3)
您的连接字符串mongodb://127.0.0.1:27017/mydb
通过引用127.0.0.1
(localhost)告诉您的NodeJS应用程序连接到同一容器中的MongoDB。
您希望告诉它连接到MongoDB容器,具体取决于您启动MongoDB容器的方式,使用类似mongodb://mongodb:27017/mydb
的内容。
如果您使用docker-compose
之类的容器启动容器,则应该能够使用服务名称:
...
services:
mongodb: <--- you can use this in your connection string
image: xxx
your-node-app:
image: xxx
如果您未使用docker-compose
并且正在使用--link
,则需要在连接字符串中引用该链接的名称。
如,
docker run -d --name mongodb mongodb
docker run -d --link mongodb:mongodb your-node-app
注意:原因是因为docker会在/etc/hosts
文件中添加一个条目,将服务名称/链接名称指向链接容器的私有IP地址。< / p>