我正在尝试从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)
答案 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.databases
为Array
,则更合适地使用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', ...
});