Javascript 是否有将基于字符串的JSON转换为Mongoose模式对象实例的本机功能?

Javascript 是否有将基于字符串的JSON转换为Mongoose模式对象实例的本机功能?,javascript,express,mongoose,Javascript,Express,Mongoose,我正在使用Express,我正在寻找一种方便的方法来转换此类对象(请求req.body.myObject): 进入此架构的实例: var myObjectSchema = new Schema({ name: String, someNumber: Number, someBoolean: Boolean }); 请注意,第一个对象来自请求,因此它完全由字符串生成 有什么好办法可以做到这一点吗?如果不是,您对如何将此功能作为中间件实现有何建议?如果模式是静态的,理论上可

我正在使用Express,我正在寻找一种方便的方法来转换此类对象(请求
req.body.myObject
):

进入此架构的实例:

var myObjectSchema = new Schema({
    name: String,
    someNumber: Number,
    someBoolean: Boolean
});
请注意,第一个对象来自请求,因此它完全由字符串生成


有什么好办法可以做到这一点吗?如果不是,您对如何将此功能作为中间件实现有何建议?

如果模式是静态的,理论上可以采用惰性、不复杂的方式,只需硬编码值,而不是传递对象本身:

var someObject = {
    name: "Foo",
    someNumber: "23",
    someBoolean: "on"
}

var myObjectSchema = new Schema({
    name: someObject.name,
    someNumber: parseInt(someObject.someNumber, 10),
    someBoolean: (someObject.someBoolean == "on")
});

可能不是你正在寻找的答案,但如果没有更好的东西,可能会考虑一些东西。

通过引用这个线程,我发现是的,这里面有一个内置的特性。

您只需构建一个新模型,将请求值(来自表单)作为参数传递:

function add(req, res){
    new Contact(req.body.contact).save(function(err){
        console.log("Item added");
        res.send();
    });
};

它会自动为您转换内容

我知道这个答案已经被接受了,但我想指出的是猫鼬为你安排了大部分演员。。。大多数时候。虽然猫鼬这样做很方便,但它抽象出了猫鼬的真实行为。例如,mongoose允许您执行以下操作:

PersonModel.findById("4cdf00000000000000007822", ...);
PersonCollection.find({_id: ObjectId("4cdf00000000000000007822")}, ...);
但是,如果您尝试直接查询数据库(不使用mongoose),这将不起作用:

PersonCollection.find({_id: "4cdf00000000000000007822"}, ...);
这是因为objectid不是字符串。。。它们是物体。在内部,mongoose将该字符串转换为ObjectId,然后对数据库执行查询,这样最终的查询看起来有点像这样:

PersonModel.findById("4cdf00000000000000007822", ...);
PersonCollection.find({_id: ObjectId("4cdf00000000000000007822")}, ...);
此外,模式中的每个路径都有一个“caster”方法。这是一个私有方法,但是当你需要它时,它非常方便请注意,下面描述的
caster
方法没有文档记录,可以在没有警告的情况下更改。使用风险自负
(很抱歉大喊大叫):


我为什么知道这个?因为如果您想使用mongo的一些更高级的功能,比如聚合,那么您需要在构建管道时转换自己的值。我还需要为某些使用
$in
运算符的查询手动强制转换值。。。也许这已经不需要了。关键是,如果您无法获得预期的结果,请尝试自己强制转换值。

“注意,第一个对象来自请求,因此它完全由字符串生成。”-为什么不将其更改为在适当的位置返回数字和布尔值?在我引用的句子中使用“so”意味着只允许使用字符串,但如果是JSON,则不是这样。(也就是说,JSON本身是一种基于字符串的格式,但它可以表示数字和布尔值,当解析JSON时,这些属性会变成数字和布尔值…)模式中的属性是固定的,还是需要动态的?@nnnnnn问题是Express从形式
myObject[name]:name,myObject中获取信息[someNumber]:23
,默认情况下,Express本身构造myObject,将每个属性设置为字符串!正如您所想,我正在寻找一种方法来进行一般性操作,而不必每次编写新架构时都重写它。您不需要在联系人前面有一个“new”。这在node中非常昂贵。function add(req,res){Contact(req.body.Contact).save(函数(err){console.log(“添加的项”);res.send();});};嗨@fino,谢谢你的建议!你能提供一些关于
新的
对node来说很昂贵的资源吗?作为一个初学者,我还没有听说过!感谢eric在这里有一些好的理由。对于nodejs,搜索nodejs的内存管理和堆大小。谢谢@fino,我一定会看一看的!你会超出你的权限的d在进行研究后在生产中使用此方法。Yikes!不要与单元测试一起使用…人们经常使用未记录的功能,如果您测试代码,您就100%安全了。如果方法消失,您的测试将在您投入生产并修复它之前很久发现它。我还警告您,使用此方法的风险由您自己承担。如果您不编写测试,这就是您的p问题在于你所冒的风险;)