好的,所以我有这个 SchemaOptions、Schema、Constructor 和 virtual。
var schemaOptions = {
toObject: { virtuals: true }, toJSON: { virtuals: true }
};
var clientSchema = mongoose.Schema ({
company: { type: String, trim: true, required: true, unique: true },
monthly_cost: { type: Number, trim: true, required: true },
sms_cost: { type: Number, trim: true, required: true },
...
}, schemaOptions);
var Client = mongoose.model('Client', clientSchema);
clientSchema.virtual('creationDate').get(function () {
return dateFormat(this._id.getTimestamp(), 'isoDate');
});
再往下我有这条路线:(注意for循环中的注释代码,稍后我们将删除此注释)
app.get('/superadmin', function(req, res) {
Client.find({}, 'company monthly_cost sms_cost', function (err, docs) {
if (err) return handleError(err);
for (var i = 0, tot=docs.length; i < tot; i++) {
// docs[i].creationDate = 'strange variable ' + i;
}
console.log(docs);
res.render('superadmin/index', {
title: 'Superadmin',
docs: docs,
path: req.route.path,
});
});
});
在我的 Jade 视图中,我有以下代码:
p #{docs};
each client in docs
tr
td #{client.company}
td #{client.creationDate}
...
但是问题来了:
在我的路线中,我有:console.log(docs);
它输出一个类似于'YYYY-MM-DD'的字符串,这是预期的并且很好。
在我看来,我早期有:console.log(docs);
它还输出正确的字符串:'YYYY-MM-DD',这是预期的和好的。
但是:在我看来,#{client.creationDate} 并没有输出任何东西!!我不明白为什么。
如果我们现在像这样激活我的 for 循环中的注释行:
for (var i = 0, tot=docs.length; i < tot; i++) {
docs[i].creationDate = 'strange variable ' + i;
}
...#{client.creationDate}
将输出'strange variable [0-2]'
。但是我之前的两个console.log(docs)
仍然会输出预期的 creationDate 字符串。
我不明白这一点..似乎creationDate同时是两个变量。
Mongoose Virtuals 快把我逼疯了,我真的不明白为什么我要向他们抱怨,因为它似乎可以动态地将键值添加到获取的 mongoose 对象。好的,它们不会出现在 console.log 中......但它们以某种方式存在,我可以像这样使用它们:#{client.creationDate}
在我看来。