javascript - Mongoose 不使用模型 save() 强制执行类型

标签 javascript node.js mongodb mongoose

在我的架构中,我有:

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"].dataNumber 类型> 而不是 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/

相关文章:

javascript - 如何验证日期?

javascript - 使用 Modernizr 为 chrome 加载单独的样式表?

javascript - 我应该如何向其他本地服务器发出请求?

php - 在社交网络上存储文件的最佳方式

javascript - 我的 react-native 文件和 server.js 之间的通信

json - Node.js 服务器 : JSON. 字符串化深层对象

javascript - Node.js:无法查找 View

javascript - 如何告诉样式标签从类中获取属性?

mongodb - 为什么在聚合查询中 $avg 会得到 "-Infinity"结果?

MongoDb:如何对日期字段进行聚合、分组和排序?