Mongoose对Number字段接受null

时间:2017-07-20 07:27:51

标签: node.js mongoose mongoose-schema

我有一个mongoose架构,我正在存储一个端口号。我也为该字段设置了默认值。

port:{
    type:Number,
    default:1234
}

如果我没有通过我的API获得任何价值,则会将其设置为1234。 但是,如果有人发送null,则会接受null并保存到数据库。

它不应该将null转换为1234吗? null不是数字!我理解错了吗?

我正在考虑给出here的解决方案,但是我不想为没有它的情况添加额外的代码(除非我错了,它不应该将null转换为{{ 1}})

2 个答案:

答案 0 :(得分:2)

请参阅此问题中的评论:

  

null是Date属性的有效值,除非您指定required。如果值未定义,则默认值仅被设置,而不是如果它是假的。

(它关于日期,但也可以应用于数字。)

您可以选择:

  • : ${AA="/root/"} 添加到字段
  • 添加一个拒绝它的自定义验证程序
  • 使用钩子/中间件来解决问题

你可能会使用这样的预保存或后验证(或其他)钩子:

required

但可能你必须使用类似的东西:

YourCollection.pre('save', function (next) {
  if (this.port === null) {
    this.port = undefined;
  }
  next();
});

有关如何在函数调用中使YourCollection.pre('save', function (next) { if (this.port === null) { this.port = 1234; // get it from the schema object instead of hardcoding } next(); }); 触发默认值的一些技巧,请参阅此答案:

令人遗憾的是,Mongoose无法配置为null null(带有一些" not-null"参数或类似的东西),因为有时会出现这样的情况:您使用JSON作为请求获得的数据,有时可以将undefined转换为null:

undefined

甚至在没有(显式)> JSON.parse(JSON.stringify([ undefined ])); [ null ] 的情况下添加null值:

undefined

答案 1 :(得分:1)

如猫鼬官方文档here

中所述

编号 要将路径声明为数字,可以使用Number全局构造函数或字符串'Number'。

const schema1 = new Schema({ age: Number }); // age will be cast to a Number
const schema2 = new Schema({ age: 'Number' }); // Equivalent
const Car = mongoose.model('Car', schema2);
There are several types of values that will be successfully cast to a Number.
new Car({ age: '15' }).age; // 15 as a Number
new Car({ age: true }).age; // 1 as a Number
new Car({ age: false }).age; // 0 as a Number
new Car({ age: { valueOf: () => 83 } }).age; // 83 as a Number

如果您传递一个带有valueOf()函数的对象,该对象返回一个Number,Mongoose将对其进行调用并将返回的值分配给该路径。

null和undefined值不会被强制转换。

NaN,强制转换为NaN的字符串,数组以及不具有valueOf()函数的对象都将导致CastError。