这是我的 database.js 文件:
const MongoClient = require('mongodb').MongoClient;
const db = function(){
return MongoClient.connect('mongodb://localhost:27017/users', (err, database) => {
if (err) return console.log(err);
return database;
});
}
module.exports = db;
我将它包含在我的 server.js 中:
var db = require('./database');
但是当我想像这样使用它时
db().collection('orders')
我收到一个TypeError(无法读取属性'未定义的集合)
编辑:抱歉,我在撰写此问题时遇到了问题,当然我使用了db().collection
答案 0 :(得分:1)
问题在于您的导出和误解了节点回调的行为。
const MongoClient = require('mongodb').MongoClient;
const db = function(){
return MongoClient.connect('mongodb://localhost:27017/users', (err, database) => {
// this is inside a callback, you cannot use the database object outside this scope
if (err) return console.log(err);
return database; // this database object is what you should be exporting
});
}
module.exports = db; // You are exporting the wrong variable
解决此问题的一种方法是(可能不是最好的)导出我们在回调中收到的数据库对象。例如:
const MongoClient = require('mongodb').MongoClient;
let database = null;
MongoClient.connect('mongodb://localhost:27017/users', (err, db) => {
if (err) return console.log(err);
database = db;
});
module.exports = database;
现在你可以使用db,但是使用空检查。
var db = require('./database');
if (db !== null) {
db.collection('orders').find({}, (err, docs) => {
if (err) return console.log(err);
console.log(docs);
});
}
但是当你需要database.js文件时,这可能导致连接一次又一次地建立(我不确定)。更好的方法是:
const MongoClient = require('mongodb').MongoClient;
let database = null;
const connect = () => {
if (database !== null) return Promise.resolve(database);
return new Promise((resolve, reject) => {
MongoClient.connect('mongodb://localhost:27017/users', (err, db) => {
if (err) return reject(err);
database = db;
resolve(database);
});
});
};
module.exports = connect;
然后像:
一样使用它var dbConnect = require('./database');
dbConnect().then((db) => {
db.collection('orders').find({}, (err, docs) => {
if (err) return console.log(err);
console.log(docs);
});
}).catch((err) => {
console.error(err);
});