我正在尝试使用从MongoDB捕获的数据异步填充Array。我有一组函数,它们应该逐个执行以将来自不同表的2个结果合并为一个,但是在执行时,会产生错误:
TypeError: Cannot read property 'apply' of undefined
这是路由器的代码:
var Co2 = require("./../models/co2.model"),
Dht = require("./../models/co2.model"),
express = require("express"),
q = require("q"),
router = express.Router();
router.get("/all", function(req, res, next) {
var co2Collector = function() {
Co2.showAll(function(err, results) {
co2Data = [];
if (err) {
res.json(err);
}
for (i = 0; i < results.length; i++) {
co2Data.push(results[i]);
}
return co2Data;
});
};
var dhtCollector = function() {
Dht.showAll(function(err, results) {
dhtData = [];
if (err) {
res.json(err);
}
for (i = 0; i < results.length; i++) {
dhtData.push(results[i]);
}
return dhtData;
});
};
var dataMerge = function(co2Data, dhtData) {
mergedData = [];
mergedData = mergedData.concat(co2Data, dhtData);
res.json({
message: "Done!",
result: mergedData
});
};
q
.fcall(co2Collector())
.then(dhtCollector())
.then(dataMerge())
.done();
});
module.exports = router;
这个逻辑似乎对我来说是正确的,但是,再说一次,我对这种东西不熟悉,文档对我的理解有点模糊。 谢谢你的帮助!
P.S:问题可以在Schema和静态方法中吗?作为回报,无论对代码进行了哪些调整,结果都是undefined
,null
。
这是我的猫鼬模式:
var CO2Schema = mongoose.Schema(
{
location:{ type: String,required: true },
reading: { type: String, required: true }
},
{
timestamps: { createdAt : 'created_at', updatedAt : 'updated_at' },
}
);
// Get CO2 results
CO2Schema.statics.showAll = function(cb) {
return this.find({}, cb);
};
答案 0 :(得分:0)
在这里,您预先调用所有三个功能,并等待响应
q
.fcall(co2Collector())
.then(dhtCollector())
.then(dataMerge())
.done();
实际上是:
var a = co2Collector();
var b = dhtCollector();
var c = dataMerge();
q
.fcall(a)
.then(b)
.then(c)
.done();
您应该将函数本身作为参数或箭头函数传递。
q
.fcall(co2Collector)
或
q
.fcall(() => co2Collector())
等
答案 1 :(得分:0)
如果这是一个返回承诺的函数,那么你需要返回它。
来自Co2.showAll
的{{1}},以便co2Collector
可以将值传递给下一个链接函数。
需要致电q
,以便将这两个值传递给.all([co2Collector(), dhtCollector()])
dataMerge
q.fcall(dhtCollector)