好的,所以我有这个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}
。 最佳答案
这段代码是乱序的:
var Client = mongoose.model('Client', clientSchema);
clientSchema.virtual('creationDate').get(function () {
return dateFormat(this._id.getTimestamp(), 'isoDate');
});
在将其“编译”为模型之前,必须完全配置您的模式。它不是动态的。编译模型后,对该架构的进一步更改将不起作用。
关于node.js - Mongoose 虚拟人被搞砸了吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18850749/