我正在尝试使用预定义的Schema静态方法创建一个填充集合的方法。我希望它从2个不同的集合中获取所有文档并返回它们。对我来说,创建一个单独的Schema并返回this.find().populate()
回调似乎是合乎逻辑的,但我无法让它工作......
以下是我的架构:
dht.model.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
// Dht Schema from MongoDB
var DhtSchema = mongoose.Schema({
location: {
type: String,
required: true
},
reading: {
type: String,
required: true
}
}, {
timestamps: {
createdAt: 'created_at',
updatedAt: 'updated_at'
},
});
co2.model.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
// CO2 Schema from MongoDB
var CO2Schema = mongoose.Schema({
location: {
type: String,
required: true
},
reading: {
type: String,
required: true
}
}, {
timestamps: {
createdAt: 'created_at',
updatedAt: 'updated_at'
},
});
excel.model.js
这是我想要动态填充的模式,因为新数据每20分钟从MQTT中间件添加到数据库中,并且每次调用时都必须返回旧的和新的结果。
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
// Dht Schema from MongoDB
var ExcelSchema = mongoose.Schema({
co2: [{
type: Schema.ObjectId,
ref: 'co2'
}],
dht: [{
type: Schema.ObjectId,
ref: 'dhts'
}]
});
ExcelSchema.statics.showAll = function (cb) {
return this.find().populate('co2 dht').exec(function (err, cb) {
if (err) {
return err;
}
return cb;
});
};
module.exports = mongoose.model('merged_sensors', ExcelSchema);
当在API中调用方法时,它会冻结并返回504.我唯一的假设是,由于某种原因它无法访问集合,但我很可能是错的。
这是一个控制器,它为该集合进行API调用:
excel.controller.js
var Xls = require('./../models/excel.model'),
express = require("express"),
router = express.Router();
router.get("/all", function (req, res) {
Xls.showAll(function (err, results) {
if (err) throw err;
res.json(results);
})
});
module.exports = router;
答案 0 :(得分:0)
更改showAll
静态方法以包含回调参数
ExcelSchema.statics.showAll = function (cb) {
this.find().populate('co2 dht').exec(function (err, results) {
if (err) {
return cb(err);
}
cb(null, results);
});
};
将此功能调用为
... .showAll(function (err, results) {
if (err) throw err;
console.log(results);
})
如果您想坚持原始签名,那么您必须将结果传递给cb
函数,即
ExcelSchema.statics.showAll = function (cb) {
return this.find().populate('co2 dht').exec(cb);
};
并将此静态调用为
... .showAll(function (err, results) {
if (err) throw err;
console.log(results);
})