Javascript Mongoose未使用模型save()强制类型

Javascript Mongoose未使用模型save()强制类型,javascript,node.js,mongodb,mongoose,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 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()中:


它没有显示
状态:字符串的验证错误,
,因为
cpuResult.metrics[“15m”]。数据是一种类型
数字
,而不是
字符串
。。。而是将数字转换为字符串。为什么会这样?我希望对类型进行验证,我认为这在Mongoose中是自动的,不需要自定义验证

好的,那么可能不仅仅是一条评论,还有更多的信息。您要求在字段中键入
字符串。因此,猫鼬做它通常应该做的事情,并确保这是一个字符串

所有JavaScript对象(您的数字实际上是一个对象)都继承一个
.toString()
方法。所以这里发生的是调用方法,数据以字符串的形式输入

在您最喜欢的回复中尝试此选项:

var data = {};
data.number = 1;

data.number.toString();
这表明该方法是有效的

反之则不正确,因为字符串不能隐式转换为数字。因此,如果为模式字段定义了一个数字,字符串实际上将无法通过验证:

var data = {}
data.number = "1"

因此,这实际上更多的是一个“JavaScript如何工作”的问题,而不是关于mongoose验证的问题。

您的状态类型是String,所有JavaScript对象本身都有一个隐式调用的
.toString()
方法。即使
类型是:number
?这没有意义,因为Mongoose模式使用类型。如果上述情况属实,为什么猫鼬会使用类型呢?我假设它使用类型并检查它们。是的……这被证明是正确的,非常有用……只是测试了一下。但是,我认为猫鼬的作者考虑到了这一点,并为此写了自己的验证,对吗?我希望在弄清问题的真相之前不要回答这个问题,否则这是模式类型检查中的一个主要缺陷。@dman这不是一个真正的缺陷,而是JavaScript的工作方式。它不是强类型的,如java、C++、C++、C等。如果你真的想,你可以添加预保存钩子到你的字段,并通过<代码> Type of < /Cord>进行验证,以引发错误。但我认为大多数熟悉JavaScript的人都会知道
.toString()
的行为,并且不会期望与将字段标记为类型字符串有任何不同。这是从另一个来源验证的,这是预期的行为。有点傻,没有被用作类型的类型,但哦,好吧。
var data = {}
data.number = "1"