在我的架构中,我有:
var CpuSchema = new Schema({
timeStamp : { type : Date, index: true },
avaiable : Boolean,
status : String,
在我保存文档的函数中:
function saveCpu(cpuResult) {
console.log("THE TYPE IS: " + typeof(cpuResult.metrics["15m"].data));
var cpu = new Cpu ({
timeStamp : cpuResult.timestamp,
avaiable : cpuResult.available,
status : cpuResult.metrics["15m"].data,
但是在输出模型的save()中:
THE TYPE IS: number
Mongoose: cpus.insert({ __v: 0, metrics: [ '[object Object]', '[object Object]', '[object Object]' ], _id: ObjectId("5397bcf1803ee2e535776934"), status: '0.05', avaiable: true, timeStamp: new Date("Wed, 11 Jun 2014 02:22:06 GMT") }) {}
它没有显示 status : String,
的验证错误,因为 cpuResult.metrics["15m"].data
是 Number
类型> 而不是 String
...而是将数字转换为字符串。为什么是这样?我想要对类型进行验证,并且我认为这在 Mongoose 中是自动的,不需要自定义验证。
最佳答案
好吧,可能不仅仅是评论,还有更多信息。您已要求在字段中使用 String
类型。因此, Mongoose 会做它通常应该做的事情,并确保这是一个字符串。
所有 JavaScript 对象(您的号码实际上是一个对象)都会继承 .toString()
方法。所以这里发生的是调用该方法并且数据作为字符串输入。
在您最喜欢的 REPL 中尝试一下:
var data = {};
data.number = 1;
data.number.toString();
这表明该方法是有效的。
反之则不然,因为字符串不能隐式转换为数字。因此,如果您为架构字段定义了一个数字,那么字符串实际上会验证失败:
var data = {}
data.number = "1"
所以实际上这更多的是一个“JavaScript 如何工作”的问题,而不是关于 Mongoose 验证。
关于javascript - Mongoose 不使用模型 save() 强制执行类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24153711/