我的数据库文件出了什么问题?

时间:2017-03-24 18:26:25

标签: javascript node.js mongodb express

这是我的 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

1 个答案:

答案 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);
});