猫鼬不执行保存并且不显示错误

时间:2020-07-26 09:54:28

标签: node.js mongodb express mongoose

嗨,我有以下代码:

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

4 个答案:

答案 0 :(得分: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 })
    }
}

答案 1 :(得分:0)

尝试摆脱RES前面的退货。函数调用

赞:

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 })
} 

答案 2 :(得分:0)

我已经预先保存了“产品”模型,这让我无法通过。我正在从其他模型复制和粘贴,却忘记删除unecesarry代码。

答案 3 :(得分:0)

我建议您摆脱该回调并使用干净的async-await。通过使用此代码也将更短。而且我认为这会起作用。试试这个。

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 })
    }
}

相关问题