我想动态地为Mongoose结果的每个对象添加一个属性,但它不会按预期工作。
Font.find()
.exec(function (err, fonts) {
if(err) return res.send(err);
_.each(fonts, function(item, i) {
item.joined_name = item.name + item.style.replace(/\s/g, '');
console.log(item.joined_name); // works fine
});
res.send(fonts); // `joined_name` property is nonexistant
});
必须简单,但我无法弄清楚原因。欢迎替代方案!
答案 0 :(得分:2)
Mongoose documents 不允许添加属性。您需要在 Font.find().lean().exec(function (err, docs) {
docs[0] instanceof mongoose.Document // false
});
之前调用lean()
方法,因为启用了精益选项的查询返回的文档是普通的javascript对象。
来自文档:
Font.find()
.lean()
.exec(function (err, fonts) {
if(err) return res.send(err);
_.each(fonts, function(item, i) {
item.joined_name = item.name + item.style.replace(/\s/g, '');
console.log(item.joined_name); // works fine
});
res.send(fonts);
});
所以你的代码应该是这样的:
Font.find()
.exec(function (err, docs) {
if(err) return res.send(err);
var fonts = [];
_.each(docs, function(item, i) {
var obj = item.toObject();
obj.joined_name = obj.name + obj.style.replace(/\s/g, '');
console.log(obj.joined_name);
fonts.push(obj);
});
res.send(fonts);
});
或将返回的文档强制转换为普通对象:
Uncaught TypeError: $(...).datetimepicker is not a function