【问题标题】:mongoDb database form-data empty responsemongoDb 数据库表单数据空响应
【发布时间】:2018-12-02 14:17:26
【问题描述】:

我正在使用邮递员向 mongoDb 发送 Rest POST Request(form-data)。即使在模型中提供了所有键值对之后,也只有 product _id 被存储到数据库中,而不是其他对象数组。这是我的模型架构:

const mongoose = require('mongoose');

const productSchema = mongoose.Schema({

    name: String,
    price:  Number, 
    editor1: String, 
    year: String,
    quantity: Number,
    subject: String,
    newProduct:  String,
    relatedProduct: String,
    //coverImage: { type: String, required: false }
});

module.exports = mongoose.model('Product', productSchema);

这是我对产品的 POST 请求:

exports.products_create_product = (req, res, next) => {
  const product = new Product(req.body);
  product
    .save()
    .then(result => {
      console.log(result);
      res.status(201).json({
        message: "Created product successfully",
        createdProduct: {
          name: result.name,
          price: result.price,
          _id: result._id,
          request: {
            type: "GET",
            url: "http://localhost:3000/products/" + result._id
          }
        }
    });
  })
    .catch(err => {
      console.log(err);
      res.status(500).json({
        error: err
      });
    });
};

这是我的结果输出:

{
    "message": "Created product successfully",
    "createdProduct": {
        "_id": "5b2df3420e8b7d1150f6f7f6",
        "request": {
            "type": "GET",
            "url": "http://localhost:3000/products/5b2df3420e8b7d1150f6f7f6"
        }
    }
}

尝试了所有可能的方法来解决这个问题,但徒劳无功。

【问题讨论】:

  • 你是在任意路径调用函数吗
  • @PrajvalM 是的。所有特定路线都已定义

标签: node.js mongodb rest


【解决方案1】:

@mostafa 是的,我试过了。

{
"count": 3,
"products": [
    {
        "_id": "5b2e2d0cb70f5f0020e72cb6",
        "request": {
            "type": "GET",
            "url": "https://aa-backend.herokuapp.com/products/5b2e2d0cb70f5f0020e72cb6"
        }
    },
    {
        "_id": "5b2e2d37b70f5f0020e72cb7",
        "request": {
            "type": "GET",
            "url": "https://aa-backend.herokuapp.com/products/5b2e2d37b70f5f0020e72cb7"
        }
    },
    {

这是我得到的唯一输出。

【讨论】:

    【解决方案2】:

    首先让我们试着理解为什么会发生这种情况? ,

    当您在此方法中使用 .json() 方法时,它使用 JSON.stringify() 函数,此函数的作用是获取任何 JavaScript 值并将其转换为 JSON 字符串,例如

    let product = {
        name : 'p1' ,
        price : 200
    }
    console.log(JSON.stringify(product)); // {"name":"p1","price":200}

    这很好,但你应该知道,如果这个函数在转换过程中看到任何未定义的值,它将被省略,
    例如

    let product = {
        id:"23213214214214"
    } // product doesn't have name property and its undefind  
    console.log(JSON.stringify({
        id:product.id ,
        name : product.name
    })); // {"id":"23213214214214"}

    如果您查看上面的示例,您会发现因为 name 的值是 **undefined ** 您会得到 JSON 输出,但只有 id 值,并且任何未定义的值都不会出现在结果中.

    这就是您仅使用 product._id 获得结果的主要原因,因为 pricename 等其他值未定义。

    那么如何解决这个问题呢?

    • 记录req.body 并确保它具有名称和价格等属性,我认为这是问题的主要原因,因为当您创建产品变量时,它只有 _id 属性,因为其他属性不存在.
    • 创建产品后将其记录到控制台并确保它具有其他属性,例如名称和价格

    【讨论】:

    • 我什至尝试过但仍然得到相同的结果:只有_id
    • 你检查了 req.body 吗?你能分享它的输出吗?
    • @Piyu 做一件事,展示你的 Schema 和 req.body 的数据。
    【解决方案3】:

    试试callback

     product.save((err,result) =>{
    
         if(err){
          res.status(500).json({
            error: err
          });
          return false
         }
    
          res.status(201).json({
                message: "Created product successfully",
                createdProduct: {
                  name: result.name,
                  price: result.price,
                  _id: result._id,
                  request: {
                    type: "GET",
                    url: "http://localhost:3000/products/" + result._id
                  }
                }
        })
    

    【讨论】:

    • 并检查 req.body 是否与您的收藏字段匹配
    • 所有集合都与模型字段相似
    • @PriyaJain 将您的 post man form-data 中的标题更改为 x-www-form-urlencoded
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2018-09-03
    • 2019-08-02
    • 2011-07-15
    • 2016-11-18
    • 2013-03-05
    相关资源
    最近更新 更多