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中未定义的属性“集合”
注意:我之前曾尝试使用它以前可以工作的较低版本进行尝试,但是在那里遇到了新版本。
答案 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.
});