【问题标题】:How to exit the whole try block when I encounter an error inside a function that I created当我在创建的函数中遇到错误时如何退出整个 try 块
【发布时间】:2021-05-25 16:06:00
【问题描述】:
try {
    const skills = []
    
    req.body.skills.forEach(async (element) => {
        const skill = await Skill.findOne({name : element.skill})

        if (!skill) {
            return res.status(400).send('Skill : '+element.skill+' is not present')
        }

        skills.push(
            {
                skill : skill._id,
                skillname : skill.name
            }
        )
    })

    if (!await User.findOne(req.params)) {
        return res.status(400).send('The username : '+req.params.username+' doesnot exist')
    }

    console.log(skills);

    res.status(200).send(req.body)

} catch (error) {
    console.log(error);
}

在此我得到错误,当技能在数据库中不存在时,如:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:526:11)
at ServerResponse.header (D:\Teamin\teaminbackend\node_modules\express\lib\response.js:771:10)
at ServerResponse.send (D:\Teamin\teaminbackend\node_modules\express\lib\response.js:170:12)
at ServerResponse.json (D:\Teamin\teaminbackend\node_modules\express\lib\response.js:267:15)
at ServerResponse.send (D:\Teamin\teaminbackend\node_modules\express\lib\response.js:158:21)
at D:\Teamin\teaminbackend\router\user.js:48:25
at processTicksAndRejections (internal/process/task_queues.js:97:5) {

代码:'ERR_HTTP_HEADERS_SENT' }

所以我想知道当我在我创建的函数中遇到错误时如何退出整个 try 块(return 语句只中断我创建的函数而不是整个 try 块,因为它试图运行代码

res.send(req.body)

导致错误

【问题讨论】:

    标签: javascript node.js mongodb return try-catch


    【解决方案1】:

    您可以在 Array.prototype.forEach() 的 MDN 文档中看到:

    注意:没有其他方法可以停止或中断 forEach() 循环 抛出异常。如果你需要这样的行为,forEach() 方法 是错误的工具。

    可以通过以下方式提前终止:

    • 一个简单的 for 循环
    • for...of / for...in 循环 Array.prototype.every()
    • Array.prototype.some()
    • Array.prototype.find()
    • Array.prototype.findIndex()

    数组方法:every()、some()、find() 和 findIndex() 使用返回真值的谓词测试数组元素以确定是否需要进一步迭代。

    所以你需要使用for 循环而不是Array.prototype.forEach() 来控制流:

    try {
        const skills = []
        
        for (const element of req.body.skills) {
        
            const skill = await Skill.findOne({name : element.skill})
    
            if (!skill) {
                return res.status(400).send('Skill : '+element.skill+' is not present')
            }
    
            skills.push(
                {
                    skill : skill._id,
                    skillname : skill.name
                }
            )
        }
    
        if (!await User.findOne(req.params)) {
            return res.status(400).send('The username : '+req.params.username+' doesnot exist')
        }
    
        console.log(skills);
    
        res.status(200).send(req.body)
    
    } catch (error) {
        console.log(error);
    }
    

    这样,return 语句使周围的函数返回(而不是完全没有效果的 Array.prototype.forEach() 回调)。

    【讨论】:

    • 谢谢。我会试试这个,让你知道
    【解决方案2】:

    试试这样的:

    try {
        const skills = []
        
        req.body.skills.forEach(async (element) => {
            const skill = await Skill.findOne({name : element.skill})
    
            if (!skill) {
                throw { status: 400, message: 'Skill :'+element.skill+'is not present' };
            }
    
            skills.push(
                {
                    skill : skill._id,
                    skillname : skill.name
                }
            )
        })
    
        if (!await User.findOne(req.params)) {
            throw { status: 400, message: 'The username : '+req.params.username+' doesnot exist' };
        }
    
        console.log(skills);
    
        res.status(200).send(req.body)
    
    } catch (error) {
        console.log(error);
        return res.status(error.status).send(error.message);
    }
    

    【讨论】:

    • 通过使用这个我得到了错误:UnhandledPromiseRejectionWarning: #<Object> (node:21752) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().
    猜你喜欢
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多