我想在MongoDB中保存数据。我使用一个开放模式(没有限制)。如果我做一个POST请求,只有_ID被保存。我没有得到错误,但是我传递的数据被忽略了。
我是 Mongoose 的新手,我看了文档,但不能指出我犯了什么错误。
我的架构:
var Schema = mongoose.Schema;
var product = new Schema({any: {}});
var Product = mongoose.model('Product',product)
我的POST请求:
app.post('/input',function(request,response) {
var product = new Product(request.body);
product.save(function(err,saved) {
if (err) {
response.send({error:"could not save"});
} else {
response.send(saved);
}
})
})
MongoDB中保存的是什么:
{
"_id": "5ca8c6ada7827b6f64c603bf",
"__v": 0
}
我的意见:
{
"name":"xmen",
"age":25
}
如果需要任何其他细节,请告知我。
3条答案
按热度按时间gv8xihay1#
您将
request.body
传递给构造函数。代码中的request.body
是一个具有2个属性的对象:name: "xmen"
和age: 25
。但是,您的Schema
只包含一个属性:any: {}
({}
表示您接受任何数据类型)。当您将request.body
传递到var product = new Product(request.body);
时,您将一个具有两个属性的对象传递到一个构造函数,该构造函数期望一个具有一个名为any
的属性的对象,因此当构造函数找不到它时,它将返回一个仅具有一个_id
的对象。如果您提供:或
你会得到预期的结果。
m0rkklqb2#
您遇到这种情况是因为Mongoose模式不知道它应该存储在文档中的属性。
您在模式定义中使用了
any
作为键,我假设您这样做是因为您遵循了文档中的SchemaTypes部分。any
并不意味着任何属性都是可接受的。它意味着Mongoose正在寻找一个键为 “any” 的值。如果您的请求主体不包含这样的键(它确实不包含,因为它只包含 name 和 age),那么当您保存新对象时,它将不会被拾取。你所经历的是 Mongoose 的正常行为。
定义架构
MongoDB的文档结构很灵活,但是,当你定义一个新的模式时,你必须定义所有可能的属性和它们的类型(你也可以使用
{}
作为一个类型来支持任何类型--尽管不推荐这样做)。可以按如下方式定义模式:
这意味着当您为新对象调用
.save()
时,Mongoose将只选取模式中指定的属性(以及_id
和__v
,默认情况下,它们存在于任何模式中)。了解更多关于Mongoose架构here的信息。
k2arahey3#
1.基本上,如果你试图检查和控制台记录你的请求体或请求体,那么你可能会得到未定义。所以,你需要检查你是否已经写在文件或没有。
应用程序使用(express.json())
这是将你的数据定义为json数据。
1.第二个检查也与第一个检查相关,因为确保在使用postman等工具进行POST请求时选择JSON作为Body类型。
这两个在我的情况下都起作用:)