无法为async.forEachOf,express,mongoose定义回调

时间:2016-07-23 16:27:57

标签: javascript node.js mongodb

我正在尝试从mongo获取所有数据库,每个数据库都有一个包含任务详细信息的集合'meta'。我想将所有任务的详细信息发送给客户。

对于node.js来说相当新,因此hacky代码,对于下面的代码,这是我得到的响应。

Here
GET /tasks 304 8.283 ms - -
There [object Object]
GET /favicon.ico 304 1.084 ms - -

'这里'记录在'那里'之前。 我无法为此定义回调。

// get list of tasks, basically list of dbs
app.get('/tasks', function (req, res) {
    var connection = mongoose.createConnection('mongodb://localhost/temp');
    connection.on('open', function() {
    // connection established
        new Admin(connection.db).listDatabases(function(err, result) {
        console.log('listDatabases succeeded');
        // database list stored in result.databases
        var allDatabases = result.databases;
        // iterate and add meta and completion
        var sendData = new Array();
        async.forEachOf(allDatabases, function(value, key, callback) {
            var dbName = value.name;
            console.log(dbName);
            var result;
            if(dbName!='local') {
                var database_name = dbName;
                var tempCon = mongoose.createConnection('mongodb://localhost/'+database_name);
                var Meta = new mongoose.Schema({
                    originalname    : { type: String, trim: true }
                });
                tempCon.model('meta', Meta).find({ task: { $ne: null } }, function(err, doc) {
                    result = doc[0].toObject();
                    var obj = {
                        "task_hash" : database_name,
                        "task_info" : result
                    };
                    sendData.push(obj);
                    console.log("There "+sendData);
                });
            }
        });
        console.log("Here "+sendData);
        res.send(sendData);    
        });
    });
});

我也尝试在函数本身中定义回调,但是给出了错误。

        async.forEachOf(allDatabases, function(value, key, callback() {
                                                                   ^

SyntaxError:意外的令牌(     在exports.runInThisContext(vm.js:53:16)

1 个答案:

答案 0 :(得分:0)

forEachOf(obj, iterator, [callback])因此,请尝试更改以下代码

                console.log("There "+sendData);
            });
        } // end of "if(dbName!='local')"
    }, function(err) {
        console.log("Here "+sendData);
        res.send(sendData);
    });

如果result.databasesArray,则更合适地使用map

app.get('/tasks', function (req, res) {
    var connection = mongoose.createConnection('mongodb://localhost/temp');
    connection.on('open', function() {
        new Admin(connection.db).listDatabases(function(err, result) {
            console.log('listDatabases succeeded');
            // database list stored in result.databases 
            var dbs = result.databases
                .map(function(db) { return db.name}) // transform to ['db1', 'db2', 'local']
                .filter(function(name) { name != 'local' }); // remove 'local'

            async.map(dbs, function(db, callback) {
                var conn = mongoose.createConnection('mongodb://localhost/' + db);
                var Meta = new mongoose.Schema({
                    originalname : { type: String, trim: true }
                });
                conn.model('meta', Meta).find({ task: { $ne: null } }, function(err, doc) {
                    // probably we need close temporary conn; I don't work with mongodb
                    // If we don't need to close then we call callback instead function(err, doc) and transfrom if finally-function
                    callback(err, (err) ? null : {
                        "task_hash" : db,
                        "task_info" : doc[0].toObject()
                    });
                }); 
            }, 
            // async finally function 
            function(err, results) {
                if (err)
                    return ...; // Show error to user

                console.log(results);
                res.json(results);
            }); // end of async  
        });
    }); // end of connection.on('open', ...
});