当前位置: 首页 > 知识库问答 >
问题:

在异步等待中处理尝试捕获中的“抛出错误”是否有任何问题?

朱渝
2023-03-14

我有一种使用猫鼬将产品发布到mongodb的方法。我使用的是异步等待而不是当时的捕获块。我的代码 :

const Category = require('../models/category');

exports.postProduct = async (req,res,next)=>{
    //const userId = req.user.userId;
    const userId = '5dca886a1ee97b07002de048';
    // const category = req.body.category;
    const category = ['bikes','cars'];
    // const tags = req.body.tags;
    const tags = ['wheels','vehicles','travel','s','s','s'];
    //const imageUrl = req.body.imageUrl;
    const imageUrl = ['https://picsum.photos/200/300','https://picsum.photos/200/300','https://picsum.photos/200/300'];
    try {
    if(tags.length>5){
        const error = new Error('Select only 5 Tags');
        error.statusCode = 406;
        throw error;
    }
    if (!category || category === []){
        const error = new Error('Selected category is empty, select category again');
        error.statusCode = 406;
        throw error;
    }
        const categoryFound = await Category.find({name: {$in:category}}).select('name');
        if (categoryFound) {
            const addProduct = new Product(
                {   name : 'vehicle',
                    description:'Its a good vehicle',
                    categoryId: categoryFound,
                    productImageUrl: imageUrl,
                    creatorId:userId,
                    productRequirement:'buy',
                    tags:tags
                });
          const productSaved = await addProduct.save();
        res.status(200).json({message:productSaved});
        }else{
            const error = new Error('Category not found!');
            error.statusCode = 404;
            throw error;
        }
    } catch (err) {
        if (!err.statusCode) {
            err.statusCode = 500;
        }
        next(err);
    }
};

捕获中的错误由我的应用中的快速中间件捕获.js。

//Error handling middleware
app.use((error, req, res, next) => {
    const status = error.statusCode || 500;
    const message = error.message;
    res.status(status).json({ message: message, status: status });
});

这工作正常。在这种特定情况下,当数组“标签”长于5时,我来自Postman(REST API开发工具)的请求返回:

{
    "message": "Select only 5 Tags",
    "status": 406
}

当我尝试在尝试捕获之外使用“如果”检查时,我得到这个错误:

 UnhandledPromiseRejectionWarning: Error: Select only 5 Tags
    at exports.postProduct (F:\project\controllers\products.js:17:23)
    at Layer.handle [as handle_request] (F:\project\node_modules\express\lib\router\layer.js:95:5)
    at next (F:\project\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (F:\project\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (F:\project\node_modules\express\lib\router\layer.js:95:5)
    at F:\project\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (F:\project\node_modules\express\lib\router\index.js:335:12)
    at next (F:\project\node_modules\express\lib\router\index.js:275:10)
    at Function.handle (F:\project\node_modules\express\lib\router\index.js:174:3)
    at router (F:\project\node_modules\express\lib\router\index.js:47:12)
    at Layer.handle [as handle_request] (F:\project\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (F:\project\node_modules\express\lib\router\index.js:317:13)
    at F:\project\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (F:\project\node_modules\express\lib\router\index.js:335:12)
    at next (F:\project\node_modules\express\lib\router\index.js:275:10)
    at F:\project\app.js:54:5

这种在try-catch中抛出错误以检查长度、使用if语句检查空数组的方法有效吗?有更好的方法吗?

共有1个答案

霍鸣
2023-03-14

你抛出了一个错误,但是没有人去捕捉它。当你创建一个< code>async函数时,它返回一个promise。因此,当您抛出一个错误但没有捕捉到它时,该函数将返回一个被拒绝的promise。这就是您收到< code > UnhandledPromiseRejectionWarning 的原因。当你使用async/await时,你必须使用try-catch来捕捉promise拒绝。

 类似资料:
  • 我正在与async Wait try catch块斗争几天。 这个异步函数中的try-catch是否正确? 这就是我创建自定义错误类并全局导出的方式。 要求: 故意换了工作。我想找份工作。国际直拨电话 这样我就能抓住错误。如果有错误,则抛出新创建的自定义错误类。但抛出队列错误将导致日志记录 同样,即使不需要捕捉那个里的错误,因为try块在工作,若我抛出QueueError,我只想捕捉最后一个cat

  • 我使用async、await编写了一个Javascript代码,并在每个异步函数中使用try、catch。 假设如果我写了10个异步函数,那么我需要在所有这10个函数中写try,catch。现在我脑子里有一个问题,那就是它不会造成性能开销吗?

  • 问题内容: 我正在研究节点7异步/等待功能,并不断跨这样的代码绊脚 这似乎是使用异步/等待解决/拒绝或返回/抛出的唯一可能性,但是,v8不会在try / catch块中优化代码吗? 有其他选择吗? 问题答案: 备择方案 替代方法: 显式地使用诺言将是这样的: 或类似的东西,使用延续传递样式: 原始例子 您的原始代码所做的是暂停执行并等待由其返回的诺言解决。然后,它继续执行,并将返回的值写入,如果承

  • 我正在用。NET核心编写一个ASP.NET MVC站点。我试图封装一些常见的异常处理。在基类中,我有这个方法。 从继承自该基类的控制器中,我使用如下方法: 假设_someservice.getAsync()方法如下: 这工作得很好,将捕获基类方法中的异常并返回NotFound结果。 但是,我希望避免从SomeService.GetAsync方法调用。result。我读到的任何地方都说不要那样做,因

  • 我有以下代码。 然而,它没有捕捉到所有的错误,我仍然得到“throw er//未处理的“错误”事件。 这是为什么呢? 例如,直到我添加了一个特定的错误处理程序,它才捕获parse()函数中的错误。即使不添加,我的try/catch是否应该捕获此错误? 提前致谢!

  • 我试图了解 Task.Run Wait() 异步等待是如何工作的。 我已经阅读了这个页面:了解在一行中使用Task.Run Wait()异步等待的使用,但不太理解它。 在我的代码中,我从Microsoft EventHub接收事件,并使用实现的类处理它们。我在 () 中调用 方法,这是一个异步方法,这是一个方法。由于该方法是的,因此我使用 和来委派。(即 或< code >。Wait()(该方法是