我已经创建了一个mongodb副本集在3虚拟机,manasger1,worker1,worker2.副本集工作正常,我可以登录到服务器:
docker exec -it mongoNode1 bash -c 'mongo -u $MONGO_USER_ADMIN -p $MONGO_PASS_ADMIN --authenticationDatabase "admin"'
MongoDB shell version v3.6.4
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.4
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
rs1:PRIMARY> use medmart_db
switched to db medmart_db
rs1:PRIMARY> db.providers.findObe()
2018-05-14T17:46:38.844+0000 E QUERY [thread1] TypeError: db.providers.findObe is not a function :
@(shell):1:1
rs1:PRIMARY> db.providers.findOne()
{
"_id" : ObjectId("56ddb50c230e405eafaf7781"),
"provider_id" : 6829973073,
当我运行nodejs应用程序时,它会连接到副本集。问题是,当我为我的应用程序创建一个容器时,我遇到以下异常,我的容器停止运行,我不能再连接到副本集主副本集,而是连接到次副本集。
(node:16) UnhandledPromiseRejectionWarning: MongoNetworkError: failed to connect to server [worker2:27017] on first connect [MongoNetworkError: connection 5 to worker2:27017 timed out]
at Pool.<anonymous> (/home/nupp/app/node_modules/mongoose/node_modules/mongodb-core/lib/topologies/server.js:505:11)
at Pool.emit (events.js:182:13)
at Connection.<anonymous> (/home/nupp/app/node_modules/mongoose/node_modules/mongodb-core/lib/connection/pool.js:329:12)
at Object.onceWrapper (events.js:273:13)
at Connection.emit (events.js:182:13)
at Socket.<anonymous> (/home/nupp/app/node_modules/mongoose/node_modules/mongodb-core/lib/connection/connection.js:256:10)
at Object.onceWrapper (events.js:273:13)
at Socket.emit (events.js:182:13)
at Socket._onTimeout (net.js:447:8)
at ontimeout (timers.js:427:11)
at tryOnTimeout (timers.js:289:5)
at listOnTimeout (timers.js:252:5)
at Timer.processTimers (timers.js:212:10)
(node:16) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:16) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
我用猫鼬打开了一张发行票据寻求帮助,但他们的解决方案不起作用(他们要求我从ip地址更改为域名,但我仍然得到同样的错误)。
我的连接模块是:
'use strict';
const mongoose = require('mongoose');
const getURL = (options) => {
const url = options.servers.reduce((accumulator, current) => {
accumulator += current+',';
return accumulator;
},`mongodb://${options.user}:${options.pass}@`);
return `${url.substr(0,url.length-1)}/${options.db}?replicaSet=${options.repl}&authSource=admin`;
}
const connect = (config, mediator) => {
mediator.once('boot.ready', () => {
const options = {
native_parser: true,
poolSize: 5,
user: config.user,
pass: config.pass,
promiseLibrary: global.Promise,
autoIndex: false,
reconnectTries: 30,
reconnectInterval: 500,
bufferMaxEntries: 0,
connectWithNoPrimary: true ,
readPreference: 'ReadPreference.SECONDARY_PREFERRED',
};
mongoose.connect(getURL(config), options);
mongoose.connection.on('error', (err) => {
mediator.emit('db.error', err);
});
mongoose.connection.on('connected', () => {
mediator.emit('db.ready', mongoose);
});
});
};
module.exports = Object.assign({},{connect});
我的配置文件是:
'use strict';
const serverConfig = {
port: 3000,
};
const dbConfig = {
db: 'xxxxxxx',
user: 'xxxxxx',
pass: 'xxxxxxx',
repl: 'rs1',
servers: (process.env.DB_SERVERS) ? process.env.DB_SERVERS.split(' ') : ['192.168.99.100:27017','192.168.99.101:27017','192.168.99.102:27017'],
};
module.exports = Object.assign({},{dbConfig, serverConfig});
因此,有两个步骤可以解决这个问题。首先也是最重要的是,必须更新virtualBox机器上的主机文件,以获得mongodb域的ip地址。为此:
> docker-machine ssh manager1
docker@manager1:~$ sudo vi /etc/hosts
#add the following
192.168.99.100 manager1
192.168.99.101 worker1
192.168.99.102 worker2
对worker1和worker2重复上述步骤。如果通过添加以下内容,您就可以跳过第二部分。接下来,如果出现以下错误:
Error: ERROR::providers-service::model::ProviderModel::getProviderById: TypeError: Cannot read property 'wireProtocolHandler' of null
at cb (/home/nupp/app/src/model/ProviderModel.js:182:13)
at /home/nupp/app/node_modules/mongoose/lib/model.js:4161:16
at Immediate.Query.base.findOne.call (/home/nupp/app/node_modules/mongoose/lib/query.js:1529:14)
at Immediate.<anonymous> (/home/nupp/app/node_modules/mquery/lib/utils.js:119:16)
at runCallback (timers.js:696:18)
at tryOnImmediate (timers.js:667:5)
at processImmediate (timers.js:649:5)
删除任何选项mongoose.connect.以下是我的现在的样子:
mediator.once('boot.ready', () => {
const options = {};
mongoose.connect(getURL(config), options);
mongoose.connection.on('error', (err) => {
mediator.emit('db.error', err);
});
mongoose.connection.on('connected', () => {
mediator.emit('db.ready', mongoose);
});
});
希望我的解决方案能帮助别人。我花了好几天的时间才最终弄明白。
编辑:我认为问题是cfg1-r1和cfg2-r2服务不在同一网络中。当我部署堆栈文件时,会创建一个名为mongo_mongoshard(overlay)的网络,当我检查它时,它只显示cfg1-r1作为其容器列表中的容器。
我的数据库连接是用下面的类处理的: 这是我的spring boot控制器 下面是我的dockerfile: 我读了这里和这里提到的解决方案。也阅读了一些教程,但我无法将这些解决方案中的任何一个适合我的代码。在我的代码中,我应该在哪里更改?
问题内容: 我一直在尝试获取基本的nodeJS api以连接到mongo容器。两种服务都在docker- compose.yml文件中定义。我在这里和码头工人论坛上都读过无数类似的问题,所有这些都表明问题是您的mongo连接URI。这不是我的问题,您将在下面看到。 docker-compose.yml Docker文件 db / mongoose.js 设置mongodb连接 但是无论什么api容
我一直在尝试获取一个基本的nodeJS api来连接到mongo容器。这两个服务都是在docker compose中定义的。yml文件。我在这里和docker论坛上读到了无数类似的问题,都指出问题是您的mongo连接URI。这不是我的问题,你将在下面看到。docker编写。yml公司 在此输入图像描述 Dockerfile文件 在此输入图像描述 我一直在尝试获取一个基本的nodeJS api来连接
我一直在尝试获取一个基本的nodeJS api来连接到mongo容器。这两个服务都是在docker compose中定义的。yml文件。我在这里和docker论坛上读到了无数类似的问题,都指出问题是您的mongo连接URI。这不是我的问题,你将在下面看到。 docker编写。yml公司 文档文件 db/猫鼬。js设置mongodb连接 但无论api容器无法连接什么。我尝试将mongo uri设置为
我有一个linux postgres数据库,在我的本地主机端口5432上运行。我的机器网卡的IP是192.168.68.80。我的postgres配置文件如下所示: 现在,我想从docker容器中运行的节点应用程序连接到这个数据库。这是我的环境变量文件加载到节点时的样子: 完成此设置后,我使用docker文件构建docker映像。然后,我尝试在linux上使用以下命令将dockerfile作为容器