Mongoose更新具有null值的字段抛出异常

时间:2013-04-09 19:22:31

标签: node.js mongoose

以下是模型定义:

pricing: { type: Number, default: null }

当Mongoose尝试更新源数据为null的记录时,这是我得到的异常:

我收到错误消息:

  message: 'Cast to number failed for value "NaN" at path "pricing"',
     name: 'CastError',
     type: 'number',
    value: NaN,
     path: 'pricing'

我确实需要在这种情况下使用null更新现有值,因为应用程序将该字段视为可以为空的Number字段。

如何解决?提前谢谢!

3 个答案:

答案 0 :(得分:0)

我的猜测是它正试图将null投射到Number。尝试将default设置为0;

答案 1 :(得分:0)

为定价插入空值似乎对我有用;请参阅我在下面使用的示例代码:

app.js

var mongoose = require("mongoose"),
    Widget = require("./model.js").model;

// connect to mongo
mongoose.connect("mongodb://localhost/testdb");

// test insertion
var testValid = new Widget({ name: "Valid Test", price: 10.00 }),
    testInvalid = new Widget({ name: "Invalid Test", price: null });

testValid.save();
testInvalid.save(function (err) {
    if (err) {
        console.log(err);
    }
});

model.js

var mongoose = require("mongoose");

var schema = new mongoose.Schema({
    name: String,
    price: { type: Number, default: null }
});

exports.model = mongoose.model("Widget", schema);   
exports.schema = schema;

根据您的错误消息判断,似乎正在进行无效计算,其结果是尝试插入Mongo。错误消息中的“值”是尝试插入的值。您可以通过尝试保存以下文档来验证这一点:

var testInvalid = new Widget({ name: "Invalid Test", price: "abc"});

这将导致:

{ message: 'Cast to number failed for value "abc" at path "price"',
  name: 'CastError',
  type: 'number',
  value: 'abc',
  path: 'price' }

您可以分享更多详细信息或代码示例吗?

修改

我会尝试从其余代码中隔离更新,看看是否可以复制错误,如下所示:

var mongoose = require("mongoose"),
    Widget = require("./model.js").model;

// connect to mongo
mongoose.connect("mongodb://localhost/testdb");

// insert record
var testInvalid = new Widget({ name: "Invalid Test", price: 10.00 });

// update record
testInvalid.save(function (err) {
    if (err) {
        console.log(err);
    } else {
        Widget.findOne({ name: "Invalid Test" }, function (err, record) {
            // set price to null & save
            record.price = null;
            record.save(function (err) {
                if (err) {
                    console.log(err);
                }
            });
        });
    }
});

这个孤立的更新似乎对我有用。对不起,我无法提供更多帮助:/

答案 2 :(得分:0)

NaN!= null是描述问题的最佳方式。 您应该检查您要为“NaN”插入的价格的值。 如果此测试为true,则在文档中插入null,否则插入正确解析的定价(作为数字)。