【问题标题】:Mongoose doesn't execute save and doesn't display errorMongoose 不执行保存也不显示错误
【发布时间】:2020-07-27 16:14:31
【问题描述】:

您好,我有以下代码:

export function createProduct(req, res) {
    console.log("Execution")
    const product = new Product({ ...req.body })
    product.save(function (err, product) {
        if (err) {
            console.log("error")
            const errorResponse = {}
            for (let key in err.errors) {
                //ValidationError handler
                if (err.errors[key].properties) {
                    errorResponse[key] = err.errors[key].properties.message
                }
                //CastError handler
                else {
                    errorResponse[key] = err.errors[key].toString().split(":")[1]
                }
            }
            return res.status(400).send({ ...errorResponse })
        }
        console.log("created")
        return res.send({ product })
    })
}

express 端没有错误,console.log("Execution") 正在工作并正确显示此消息。我使用 Postman 对此进行了测试,当我发送一些数据时,响应永远不会到来,并且 Postman 出现错误:“错误:套接字挂断”。

我为 req.body 制作了 console.log,这是我的输出:

{
  name: 'Apple Iphone 11 Pro 64GB Space Gray',
  category: 'smartphone',
  price: 4699,
  inMagazine: { blocked: 0, inStock: 40 },
  shortDescription: 'Odkryj wszystkie zalety iPhone 11 Pro 512 GB Silver. Smartfona, który zawstydza podkręconą wydajnością. Posiada bowiem najszybszy w historii procesor A13 Bionic oraz baterię, która pozwala na wiele. Weź iPhone 11 Pro do ręki i rób zdjęcia, których nie powstydziłby się nawet profesjonalista. Teraz masz do tego odpowiednie narzędzie – nowy iPhone 11 Pro posiada potrójny aparat główny, działający w oparciu o uczenie maszynowe. Efekty swojej fotograficznej przygody wraz z najmniejszymi detalami możesz ocenić z kolei na olśniewającym ekranie Super Retina XDR.',
  images: [ { order: 1, src: '' } ]
}

在那之后,我发现我会检查它为什么挂起,我在 nodejs 控制台中没有错误。所以我在代码中添加了两个console.log:

console.log("error")
console.log("created")

但是两者都没有执行。所以我做了一些代码重构,这和上面一样:

export async function createProduct(req, res) {
    try {
        const product = await Product.create({ ...req.body })
        console.log("created")
        return res.send({ product })
    } catch (err) {
        console.log("error")
        const errorResponse = {}
        for (let key in err.errors) {
            //ValidationError handler
            if (err.errors[key].properties) {
                errorResponse[key] = err.errors[key].properties.message
            }
            //CastError handler
            else {
                errorResponse[key] = err.errors[key].toString().split(":")[1]
            }
        }
        return res.status(400).send({ ...errorResponse })
    } 
}

我不知道这个问题的原因可能是什么。 这是整个项目的链接:https://github.com/codemasternode/DietShopping

【问题讨论】:

  • 请显示你在{ ...req.body }中传递了什么。

标签: node.js mongodb express mongoose


【解决方案1】:

假设您知道,如果您要像这样保存产品,req.body 中的所有关键字都应该与 Product 架构中的相同。 这应该有效:

exports.createProduct = async (req, res) => {
    try{
        const product = new Product(req.body).save();
        return res.json(product);
    }catch(err){
        const errorResponse = {}
            for (let key in err.errors) {
                if (err.errors[key].properties) {
                    errorResponse[key] = err.errors[key].properties.message
                }
                else {
                    errorResponse[key] = err.errors[key].toString().split(":")[1]
                }
            }
            return res.status(400).send({ ...errorResponse })
    }
}

【讨论】:

    【解决方案2】:

    尝试去掉 res 前面的 return(s)。函数调用

    像这样:

    export async function createProduct(req, res) {
    try {
        const product = await Product.create({ ...req.body })
        console.log("created")
        res.send({ product })
    } catch (err) {
        console.log("error")
        const errorResponse = {}
        for (let key in err.errors) {
            //ValidationError handler
            if (err.errors[key].properties) {
                errorResponse[key] = err.errors[key].properties.message
            }
            //CastError handler
            else {
                errorResponse[key] = err.errors[key].toString().split(":")[1]
            }
        }
        res.status(400).send({ ...errorResponse })
    } 
    

    【讨论】:

    【解决方案3】:

    我在“产品”模型中进行了预保存,但无法通过。我正在从其他模型复制和粘贴,忘记删除不必要的代码。

    【讨论】:

      【解决方案4】:

      我建议你摆脱那些回调并使用干净的异步等待。通过使用此代码也会更短。我认为这会奏效。试试这个。

      export async function createProduct(req, res) {
          try{
              console.log("Execution")
              const product = new Product({...req.body})
              let result = await product.save()
              console.log("created",result)
              return res.send({ product })
          }catch(err){
              const errorResponse = {}
                  for (let key in err.errors) {
                      if (err.errors[key].properties) {
                          errorResponse[key] = err.errors[key].properties.message
                      }
                      else {
                          errorResponse[key] = err.errors[key].toString().split(":")[1]
                      }
                  }
                  return res.status(400).send({ ...errorResponse })
          }
      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-22
        • 2016-11-21
        • 2019-12-02
        • 1970-01-01
        • 2019-10-31
        • 2016-03-15
        • 2022-01-19
        相关资源
        最近更新 更多