将 NodeJS 连接到 MongoDB Droplet
Connect NodeJS to MongoDB Droplet
所以我决定用两个 droplet 来设置我的项目,一个 MongoDB 图像 droplet 和一个 NodeJS 图像 droplet。我这样做是为了让将来更容易扩展两个液滴,并且其他应用程序将来可能会连接到数据库,两者都在 Ubuntu 18.04.
我收到以下错误:
Could not connect to the database: { MongooseServerSelectionError: connection timed out
at new MongooseServerSelectionError (/root/eternal-peace-code/node_modules/mongoose/lib/error/serverSelection.js:22:11)
at NativeConnection.Connection.openUri (/root/eternal-peace-code/node_modules/mongoose/lib/connection.js:808:32)
at Mongoose.connect (/root/eternal-peace-code/node_modules/mongoose/lib/index.js:333:15)
at Timeout.setTimeout [as _onTimeout] (/root/eternal-peace-code/app.js:60:22)
at ontimeout (timers.js:482:11)
at tryOnTimeout (timers.js:317:5)
at Timer.listOnTimeout (timers.js:277:5)
message: 'connection timed out',
name: 'MongooseServerSelectionError',
reason:
TopologyDescription {
type: 'Single',
setName: null,
maxSetVersion: null,
maxElectionId: null,
servers: Map { 'mongo_droplet_ip:27017' => [Object] },
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: null,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: null },
[Symbol(mongoErrorContextSymbol)]: {} }
我已经正确设置了两个服务器(所以我相信),我的 MongoDB 有两个用户(都是我,但权限不同,我已经进行了几次演练,所以它就发生了)。我的 /etc/mongod.conf 文件已相应编辑:
net:
port: 27017
bindIp: 127.0.0.1,mongodb_droplet_ip
security:
authorization: "enabled"
UFW 防火墙启用了 HTTPS、SSH 和我的 NodeJS_ip:27017。
我的 NodeJS Droplet 设置了一个指向正确 IP 地址的域名,letsencrypt 设置为在域名处进行安全连接。我现在遇到的问题是我无法从我的 NodeJS 应用程序连接到我的 Mongo droplet,我还想确保这一切都安全地完成。
我的 NodeJS 连接代码使用 Mongoose 和一个变量环境文件,根据我在其他地方看到的另一个建议,我还在超时函数中设置了整个连接:
setTimeout(async () => {
console.log('Connecting to database...');
const options = {
user: process.env.DBUSER,
pass: process.env.USERPASS,
keepAlive: true,
useNewUrlParser: true,
useFindAndModify: false,
useCreateIndex: true,
useUnifiedTopology: true,
sslCA: cert,
connectTimeoutMS: 5000,
}
await mongoose.connect(process.env.LIVEDB, options)
.then(() => {
console.log('We are connected to the database');
})
.catch(err => {
console.log('Could not connect to the database: ', err);
connectWithTimeout();
});
}, 3000);
我已经通过两个 droplet 尝试了很多事情,但是我浪费了大约 4 天的时间让项目进入 staging/production 阶段,这样它就可以随时启动并随着时间的推移进行更新。
如果您还需要什么,请告诉我。
非常感谢所有帮助,
谢谢
我不知道您使用的 URI 格式。但是当我尝试将我的节点应用程序与 AWS 的 Mongo 实例连接时,我最初遇到了同样的问题。
像这样使用带有所有集群名称的长 URI 字符串
mongoURI = 'mongodb://username:password@mongo-instance-shard-00-00-a4iv8.mongodb.net:27017,mongo-instance-shard-00-01-a4iv8.mongodb.net:27017,mongo-instance-shard-00-02-a4iv8.mongodb.net:27017/test?ssl=true&replicaSet=mongo-instance-shard-0&authSource=admin&retryWrites=true&w=majority'
而不是像这样:
mongodb+srv://server.example.com/
这对我有用。它也可能对您有所帮助。
此外,为数字海洋找到了这个 link
和 mongo the connection string
的文档
所以我决定用两个 droplet 来设置我的项目,一个 MongoDB 图像 droplet 和一个 NodeJS 图像 droplet。我这样做是为了让将来更容易扩展两个液滴,并且其他应用程序将来可能会连接到数据库,两者都在 Ubuntu 18.04.
我收到以下错误:
Could not connect to the database: { MongooseServerSelectionError: connection timed out
at new MongooseServerSelectionError (/root/eternal-peace-code/node_modules/mongoose/lib/error/serverSelection.js:22:11)
at NativeConnection.Connection.openUri (/root/eternal-peace-code/node_modules/mongoose/lib/connection.js:808:32)
at Mongoose.connect (/root/eternal-peace-code/node_modules/mongoose/lib/index.js:333:15)
at Timeout.setTimeout [as _onTimeout] (/root/eternal-peace-code/app.js:60:22)
at ontimeout (timers.js:482:11)
at tryOnTimeout (timers.js:317:5)
at Timer.listOnTimeout (timers.js:277:5)
message: 'connection timed out',
name: 'MongooseServerSelectionError',
reason:
TopologyDescription {
type: 'Single',
setName: null,
maxSetVersion: null,
maxElectionId: null,
servers: Map { 'mongo_droplet_ip:27017' => [Object] },
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: null,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: null },
[Symbol(mongoErrorContextSymbol)]: {} }
我已经正确设置了两个服务器(所以我相信),我的 MongoDB 有两个用户(都是我,但权限不同,我已经进行了几次演练,所以它就发生了)。我的 /etc/mongod.conf 文件已相应编辑:
net:
port: 27017
bindIp: 127.0.0.1,mongodb_droplet_ip
security:
authorization: "enabled"
UFW 防火墙启用了 HTTPS、SSH 和我的 NodeJS_ip:27017。
我的 NodeJS Droplet 设置了一个指向正确 IP 地址的域名,letsencrypt 设置为在域名处进行安全连接。我现在遇到的问题是我无法从我的 NodeJS 应用程序连接到我的 Mongo droplet,我还想确保这一切都安全地完成。 我的 NodeJS 连接代码使用 Mongoose 和一个变量环境文件,根据我在其他地方看到的另一个建议,我还在超时函数中设置了整个连接:
setTimeout(async () => {
console.log('Connecting to database...');
const options = {
user: process.env.DBUSER,
pass: process.env.USERPASS,
keepAlive: true,
useNewUrlParser: true,
useFindAndModify: false,
useCreateIndex: true,
useUnifiedTopology: true,
sslCA: cert,
connectTimeoutMS: 5000,
}
await mongoose.connect(process.env.LIVEDB, options)
.then(() => {
console.log('We are connected to the database');
})
.catch(err => {
console.log('Could not connect to the database: ', err);
connectWithTimeout();
});
}, 3000);
我已经通过两个 droplet 尝试了很多事情,但是我浪费了大约 4 天的时间让项目进入 staging/production 阶段,这样它就可以随时启动并随着时间的推移进行更新。
如果您还需要什么,请告诉我。
非常感谢所有帮助,
谢谢
我不知道您使用的 URI 格式。但是当我尝试将我的节点应用程序与 AWS 的 Mongo 实例连接时,我最初遇到了同样的问题。
像这样使用带有所有集群名称的长 URI 字符串
mongoURI = 'mongodb://username:password@mongo-instance-shard-00-00-a4iv8.mongodb.net:27017,mongo-instance-shard-00-01-a4iv8.mongodb.net:27017,mongo-instance-shard-00-02-a4iv8.mongodb.net:27017/test?ssl=true&replicaSet=mongo-instance-shard-0&authSource=admin&retryWrites=true&w=majority'
而不是像这样: mongodb+srv://server.example.com/
这对我有用。它也可能对您有所帮助。
此外,为数字海洋找到了这个 link 和 mongo the connection string
的文档