Mongoose Schema没有按预期在对象的内置Getter中进行投射

时间:2018-01-25 22:34:49

标签: mongoose

我刚刚遇到了意想不到的猫鼬行为,并希望与那些熟悉猫鼬的人确认。

我理解mongoose guide on schemas表示只要您引用架构的属性,它就会自动转换为指定的数据类型。本指南中使用的语言相当笼统,可能含糊不清:

  

我们的代码blogSchema中的每个键都在我们的文档中定义了一个属性   将被转换为其关联的SchemaType。例如,我们已经   定义了一个将转换为String SchemaType的属性标题   和属性日期将被转换为Date SchemaType。

从我最近的发现来看,它看起来并不像我想象的那样普遍。

我有transaction的架构,其中包含amount,如下所示:

let transactionSchema = mongoose.Schema({

    ...

    amount: { type: Number, required: true },
    description: { type: String, required: true },

从我的客户端,我的HTML将输入提交给路由器,并分配req.body参数,如下所示:

router.post('/save', function(req, res) {

    let theTransaction = {
        _id: req.body.transactionId,

        ...

        amount: req.body.amount,
        description: req.body.description,

据我了解这个过程,HTML正在将一个字符串发送回路由器,因此req.body.amount实际上是一个字符串。我允许mongoose保存它,并且保存的版本没有问题。

然而,让我们说theTransaction.amount = 500.当我提到我保存的theTransaction对象时,我看到555 + theTransaction.amount = 555500.00,而不是1055。

这是我的测试:

console.log("transaction.amount");       \\transaction.amount
console.log(transaction.amount);         \\500.00
console.log(typeof transaction.amount);  \\string
let nmbr = 555;
nmbr += transaction.amount;
console.log("nmbr");                      \\nmbr
console.log(nmbr);                        \\555500.00
console.log(typeof nmbr);                 \\string

我很惊讶地看到这一点。我假设mongoose会在其内置的getter中为模式执行一次转换。我开始寻找并发现你可以create your own getters in a mongoose schema

我可以理解像mongoose文档示例中所示的特殊用途getter的目的。但是,我不明白为什么mongoose会被设计为要求我为我创建的每种基本类型创建一个getter。

我是否误用了猫鼬,或者我是否需要在我的模式中添加大量的getter?或者我还有其他方法可以解决这个问题吗?

感谢。

1 个答案:

答案 0 :(得分:0)

很难判断您是否正确创建文档而未查看其中的代码,因此我无法直接帮助您解决问题。但是我可以验证在Mongoose中铸造是否完美。

const assert = require('assert');
const mongoose = require('mongoose');

const toySchema = new mongoose.Schema({
  name: { type: String },
  cost: { type: Number }
});

const Toy = mongoose.model('Toy', toySchema);

const toy = new Toy({
  name: 'Blaster',
  cost: '10.00'
});

assert.equal(typeof toy.cost, 'number'); // Passes
assert.strictEqual(toy.cost, 10.00); // Passes