Mongoose虚拟搞砸了吗?

时间:2013-09-17 13:07:37

标签: node.js mongodb express mongoose pug

好的,我有这个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让我发疯了,我真的不明白为什么我在抱怨他们无论如何似乎可以动态地将关键值添加到一个取出的猫鼬对象。好吧,他们没有出现在console.log中...但他们在某种程度上存在,我可以这样使用它们:#{client.creationDate}在我看来。

1 个答案:

答案 0 :(得分:2)

此代码无序:

var Client = mongoose.model('Client', clientSchema);

clientSchema.virtual('creationDate').get(function () {
  return dateFormat(this._id.getTimestamp(), 'isoDate');
});

在将模型“编译”到模型之前,必须完全配置模式。这不是动态的。编译模型后,对模式的进一步更改不会生效。