mongoose 当我执行POST时,数据没有保存在MongoDB中,只保存了_ID

htrmnn0y  于 2023-01-09  发布在  Go
关注(0)|答案(3)|浏览(158)

我想在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
}

如果需要任何其他细节,请告知我。

gv8xihay

gv8xihay1#

您将request.body传递给构造函数。代码中的request.body是一个具有2个属性的对象:name: "xmen"age: 25。但是,您的Schema只包含一个属性:any: {}{}表示您接受任何数据类型)。当您将request.body传递到var product = new Product(request.body);时,您将一个具有两个属性的对象传递到一个构造函数,该构造函数期望一个具有一个名为any的属性的对象,因此当构造函数找不到它时,它将返回一个仅具有一个_id的对象。如果您提供:

{ any:"xmen"}

{
    any: {
      "name":"xmen",
      "age":25
    }
  }

你会得到预期的结果。

m0rkklqb

m0rkklqb2#

您遇到这种情况是因为Mongoose模式不知道它应该存储在文档中的属性。
您在模式定义中使用了any作为键,我假设您这样做是因为您遵循了文档中的SchemaTypes部分。
any并不意味着任何属性都是可接受的。它意味着Mongoose正在寻找一个键为 “any” 的值。如果您的请求主体不包含这样的键(它确实不包含,因为它只包含 nameage),那么当您保存新对象时,它将不会被拾取。
你所经历的是 Mongoose 的正常行为。

定义架构

MongoDB的文档结构很灵活,但是,当你定义一个新的模式时,你必须定义所有可能的属性和它们的类型(你也可以使用{}作为一个类型来支持任何类型--尽管不推荐这样做)。
可以按如下方式定义模式:

{
    name: String,
    age: Number
}

这意味着当您为新对象调用.save()时,Mongoose将只选取模式中指定的属性(以及_id__v,默认情况下,它们存在于任何模式中)。
了解更多关于Mongoose架构here的信息。

k2arahey

k2arahey3#

1.基本上,如果你试图检查和控制台记录你的请求体或请求体,那么你可能会得到未定义。所以,你需要检查你是否已经写在文件或没有。
应用程序使用(express.json())
这是将你的数据定义为json数据。
1.第二个检查也与第一个检查相关,因为确保在使用postman等工具进行POST请求时选择JSON作为Body类型。
这两个在我的情况下都起作用:)

相关问题