【问题标题】:Asynchronous function not returning callback for MongoDB connect异步函数不返回 MongoDB 连接的回调
【发布时间】:2014-03-02 02:32:14
【问题描述】:

我有一个 MongoDB 连接调用导致 Heroku 应用程序崩溃..

我一直在编辑最初的 localHost 代码(运行良好)以与 Heroku MongoDb 插件(如 MongoLab)一起使用,但我如何让 someDBcollectionVariablesomeDBcollectionVariable.find() 一起使用

//MongoDB
var mongodb = require('mongodb');
var db;
var MONGODB_URI = process.env.MONGOLAB_URI;
var PORT = process.env.PORT;
var testColl;

function dbConnect() {

  return mongodb.MongoClient.connect(MONGODB_URI, function(err, database) {
    if(err) throw err;

    db = database;
    var testColl = db.collection('test');

    app.listen(PORT);
    console.log('Listening on port ' + PORT);

    return testColl;

  });
}

//calls then look like
app.post('/add', function (req, res) {    

    testColl.insert(
        {
            "title" : req.body.title,
            "quantity" : parseInt(req.body.quantity)

        },
            function (err, doc) {

                getAll(res);

            });
});

//and getAll looks like this
function getAll(res) {

    testColl.find().sort( { value: 1 } ).toArray(function (err, docs) {

        res.json({docs: docs});
    });
}

在将代码移入 dbConnect() 之前,testColl.find.. 正在生成 ResponseError,因为连接代码在设置变量之前完成?

【问题讨论】:

    标签: javascript node.js mongodb heroku express


    【解决方案1】:

    从异步函数返回值没有意义。要使用 a 值,您需要将其传递给回调函数。错误也是如此(你不能异步抛出)。您的代码的固定版本可能如下所示:

    //MongoDB
    var mongodb = require('mongodb');
    var db;
    var MONGODB_URI = process.env.MONGOLAB_URI;
    var PORT = process.env.PORT;
    var testColl;
    
    function dbConnect(callback) {
        mongodb.MongoClient.connect(MONGODB_URI, function (err, database) {
            if (err) {
                return callback(err);
            }
    
            db = database;
    
            database.collection('test', function (err, testColl) {
                if (err) {
                    return callback(err);
                }
    
                app.listen(PORT);
                console.log('Listening on port ' + PORT);
    
                callback(null, testColl); 
            });
        });
    }
    
    //calls then look like
    dbConnect(function (err, testColl) {
        if (err) {
            return console.error(err.stack || err.message);
        }
    
        testColl.find...
    });
    

    【讨论】:

    • ajax 调用会像这样app.post('/add', function (testColl, req, res) {..testColl.insert.. 还是像这样dbConnect.app.post(..
    • 还是dbConnect(testColl).app.post(..
    • 很难说。我不知道什么是应用程序(快递?)。它可能看起来像前者,但回调参数中的testColl 看起来不对。
    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2017-11-27
    • 2018-05-26
    • 2018-06-14
    • 2016-11-27
    • 2018-01-03
    • 2019-08-03
    • 2022-12-22
    相关资源
    最近更新 更多