无法在Node.js 8中创建mongodb连接

时间:2018-06-26 08:22:29

标签: javascript node.js mongodb

Nodejs:v8.11.3-mongo:v3.6.3

遵循教程http://mongodb.github.io/node-mongodb-native/3.0/tutorials/crud/

app.js

const mongoDB = require('./common_mongo.js')
mongoDB.initMongo()

common_mongo.js

const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017';
const dbName = 'onthemove';

let getDb;
const initMongo = async () => {
    const client = await MongoClient.connect(url);
    getDb = await client.db(dbName);
    await getDb.collection('comments').insert({text: 'hello'});
    //WORKS
};

module.exports = {
    initMongo,
    getDb,
};

user.js

const mongoDB = require('./common_mongo.js');

app.get('/users', async (req, res) => {     
    let list  = await mongoDB.getDb.collection('user').find({})
    //FAILS
    res.send(list);
})

TypeError:无法读取user.js中未定义的属性“集合”

注意:我之前曾尝试使用它以前可以工作的较低版本进行尝试,但是在那里遇到了新版本。

3 个答案:

答案 0 :(得分:2)

您已经在initMongo实际发生之前加载了user.js。因此,mongoDB将为getDb变量保留未定义的值。

最简单的重构方法是将getDb从变量更改为函数,这样您的代码将类似于以下内容:

common_mongo.js

const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017';
const dbName = 'onthemove';

let db;
const initMongo = async () => {
    const client = await MongoClient.connect(url);
    db = await client.db(dbName);
    await db.collection('comments').insert({text: 'hello'});
};

module.exports = {
    initMongo,
    getDb() {
      return db;
    },
};

user.js

const mongoDB = require('./common_mongo.js');    

app.get('/users', async (req, res) => {     
    let list  = await mongoDB.getDb().collection('user').find({})
    res.send(list);
})

甚至您还可以定义一个getter而不是getDb

module.exports = {
    initMongo,
    get db() {
      return db;
    },
};

app.get('/users', async (req, res) => {     
    let list  = await mongoDB.db.collection('user').find({})
    res.send(list);
})

答案 1 :(得分:1)

您需要先进行初始化,然后再使用getDb,以下代码可能会对您有所帮助

const mongoDB = require('./common_mongo.js');

app.get('/users', async (req, res) => {   
    if (!mongoDB.getDb) {  //Check getDb initialise or not
        await mongoDB.initMongo();
    }
    let list  = await mongoDB.getDb.collection('user').find({})
    //FAILS
    res.send(list);
})

答案 2 :(得分:0)

您已将initMongo声明为异步函数。当您调用initMongo时,它仅返回一个Promise,并且程序流程继续。在这种情况下,getDb尚未初始化。您可以等到诺言兑现或发生错误时为止:

mongoDB.initMongo().then(function () {
    // connection succeeded. Do the stuff from user.js
}).catch(function (err) {
     //failure callback. Doing the stuff from user.js won't make any sense here.
});