好的,所以我有这个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/

10-10 18:14