无法连接到mlab上托管的MongoDB

时间:2018-11-25 13:13:48

标签: javascript node.js database mongodb mlab

背景

制作一个小型Web应用程序,该应用程序可连接到由Mlab托管的Mongo DB。我已经在mlab上创建了数据库,并创建了具有读/写权限的用户。我还用多个记录创建了一个users集合。

问题

当我尝试使用mongo.github.io上的代码连接到数据库时,出现错误:

/home/ed/dev/mongo-demo/node_modules/mongodb/lib/operations/mongo_client_ops.js:466
      throw err;
      ^

TypeError: Cannot read property 'db' of null

代码

var MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://<user>:<pass>@ds115434.mlab.com:15434';

// Database Name
const dbName = 'princee3-music';

// Use connect method to connect to the server
MongoClient.connect(url, function(err, client) {
  console.log("Connected successfully to server");

  const db = client.db(dbName);

  client.close();
});

我尝试过的东西

奇怪的是,如果我使用以下命令通过外壳连接:

mongo ds115434.mlab.com:15434/princee3-music -u <dbuser> -p <dbpassword>

那很好,或者如果我将连接包装在一个匿名的自调用异步函数中,它也会连接。

异步包装器

 
const MongoClient = require('mongodb').MongoClient;
const mongoUrl = 'mongodb://<user>:<pass>@ds115434.mlab.com:15434/';
const dbName = 'princee3-music';

(async() => {
   const client = await MongoClient.connect(mongoUrl, { useNewUrlParser: true});
   const db = client.db(dbName);
   db.collection('users').insertOne({
     email: user.email,
     pass: hashedPassword,
     admin: true
   }, (err, result) => {
     if (err) {
       reject({error: err});
     } else {
       resolve({message: 'okay'});
     }
   });
   client.close();
 })();

任何有关我可能出问题的地方的指针都是很棒的。

1 个答案:

答案 0 :(得分:1)

mLab官方文档建议如下进行连接。它必须是异步的,以便等待连接建立,否则客户端将为null,从而引发错误,表明它无法读取null的属性db。

另一方面,您异步拥有useNewUrlParser,这可能是成功建立连接的关键,请参见this issue

MongoClient.connect(url, { useNewUrlParser: true }).then(client => client.db())