我正在尝试使用mongoose从mongoDB数据库填充数组。当我试图填写记录。它显示了函数外部的空数组,即使我声明函数外部。以下是代码。
var saveMessageToVariable = function(){
var records = [];
var spark_ids = [];
var obj = new Object();
Message.find().distinct("spark_id").exec(function(err,data) {
data.forEach(function (id) {
if(id != null)
spark_ids.push(id);
});
// console.log(spark_ids.length);
spark_ids.forEach(function(spark_id){
Message.findOne({"spark_id":spark_id}).sort({"date":-1}).exec(function(err,data){
obj.spark_id = data.spark_id;
obj.meesage = data.message;
obj.date = data.date;
obj.message_id = data._id;
records.push(obj);
});
});
});
console.log(records);
}
当我运行它时,日志显示一个空数组。我该如何解决这个问题?
答案 0 :(得分:0)
它是一个异步调用,一旦从数据库控件中获取数据转移到下一行并因此打印初始值,我希望你使用这样的回调:
function(spark_id,callback){
Message.findOne({"spark_id":spark_id}).sort({"date":-1}).exec(function(err,data){
obj.spark_id = data.spark_id;
obj.meesage = data.message;
obj.date = data.date;
obj.message_id = data._id;
callback(obj);
});
}
function(obj)
{
records.push(obj);
}
你还有另外两种方法:
1)使用try和catch块。
2)使用async和await关键字。
干杯!
答案 1 :(得分:0)
我对moongoose没有多少经验,但是according to the docs it supports promises since Version 4.
然后这应该有效:
jmeter.bat -n -t Scrept.jmx -l results.jtl
我不确定,您是否需要此代码中的//I assume you'll need this more often
function notNull(value){ return value != null; }
//returns a promise of the records-Array
var saveMessageToVariable = function(){
//returns a promise of a formated message
function getMessage( spark_id ){
return Message.findOne({ spark_id })
.sort({ date: -1 })
//.exec()
.then( formatMessage )
}
function formatMessage( msg ){
return {
spark_id: msg.spark_id,
message: msg.message,
date: msg.date,
message_id: msg._id
}
}
return Message.find()
.distinct("spark_id")
//.exec()
.then(function( ids ){
//waits for all findOnes to complete, then returns an Array
return Promise.all(
ids.filter( notNull ).map( getMessage )
));
}
。你应该检查一下。
exec()
顺便说一句。 //usage
saveMessageToVariable.then(function(records){
console.log(records);
})
并不反映此功能的作用。你应该选择一个更好的名字。