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

异步函数中未引发错误

邵刚洁
2023-03-14

我有一个异步函数,它将一些数据插入数据库(使用Mariadb)。由于重复的唯一键,此插入可能会失败,因此它会抛出错误(实际上确实如此),但当我尝试再次抛出它以通过Promise捕获它时,它不起作用;它似乎总是以成功的案例结束,即使它抛出了错误。

我尝试改变then/catch顺序,我使用了< code > reject(err);而不是< code >抛出err但是这些都不起作用。

这是POST声明:

router.post('/', function (req, res) {
    var user = req.body || {};
    createUser(user).then(() => {
        res.status(201); 
        res.send('Created!'); // This is ALWAYS sent, with the error thrown or not
    }).catch(err => {
        console.log('thrown'); // This is never printed
        res.status(500);
        res.send('Failed');
    });
});

这是创建用户函数:

async function createUser(user) {
    let conn;
    try {
        conn = await db.getConnection();
        const res = await conn.query('INSERT INTO users VALUES (NULL, ?, ?)', [user.name, user.password]); // Shorter example
        return res;
    } catch (err) {
        console.log('catched'); // This is printed
        throw err; // This is run but nothing thrown
    } finally {
        if (conn) {
            return conn.end(); // This is run after catching
        }
    }
} 

这个想法是让Promise捕获该异常,这样我就可以发送错误消息而不是成功消息。

共有1个答案

吴修洁
2023-03-14

问题在于您的最后中的返回语句。在抛出异常后的async函数中,如果您抓住它,则抛出最后并返回一些东西,而不是抛出它将promise解析为您的返回值。据我所知,您不需要结束连接的对象作为返回值,这意味着您所要做的就是将您的函数更改为:

async function createUser(user) {
    let conn;
    try {
        conn = await db.getConnection();
        const res = await conn.query('INSERT INTO users VALUES (NULL, ?, ?)', [user.name, user.password]); // Shorter example
        return res;
    } catch (err) {
        console.log('catched'); // This is printed
        throw err; // This is run but nothing thrown
    } finally {
        if (conn) {
            conn.end(); // This is run after catching
        }
    }
}
 类似资料:
  • 问题内容: 我一直在试图从概念上理解以下代码为何无法捕获。如果从零件中删除关键字,则它可以正常工作,因此它与Promise执行器是异步函数这一事实有关。 如果代替我们使用,则上面的代码可以正常工作。我想 _从根本_上理解为什么在这里不起作用。谢谢! 问题答案: [1:通过调用而不是使用and 语句] 通过“异步”,它们不是指功能,所以我认为它们的解释在这里不适用 他们也可以。一个简单的例子就 不能

  • 问题内容: 我一直在试图从概念上理解以下代码为何无法捕获。如果从零件中删除关键字,则它可以正常工作,因此它与Promise执行程序是异步函数这一事实有关。 答案重复为:“如果您在任何其他异步回调中,则必须使用”,但是通过“异步”,它们不是在引用函数,因此,我认为它们的解释在此处不适用(如果他们这样做,我不知道怎么做。 如果代替我们使用,上述代码可以正常工作。我想 从根本 上理解为什么在这里不起作用

  • 我一直试图从概念上理解为什么下面的代码没有抓住抛出的代码。如果您从部分删除关键字,那么它工作正常,所以它与Promise执行器是一个异步函数的事实有关。 这里、这里和这里的答案都重复了“如果你在任何其他异步回调中,你必须使用”,但是“异步”并不是指函数,所以我认为他们的解释不适用于这里(如果他们这样做,我不明白怎么做)。 如果我们使用拒绝代码而不是抛出代码,上面的代码可以正常工作。我想从根本上理解

  • 我在一个函数中有这样的代码块: 它获取一些数据,然后对数据运行验证()。 但是,我对数据的验证实际上也是异步的,因为它是根据一个json模式来验证数据的,而json模式位于一个独立的json文件中,所以它必须首先读取该文件。 我使用了一个承诺来读取文件内容,然后进行验证: 如何编辑此问题中的顶部代码块以解释if语句()中的异步函数?

  • 我真的需要温习一下我的异步等待和promise。我想要一些建议。 我正在对firebase firestore进行异步函数调用。函数应根据单个输入参数返回字符串。 该功能适用于1-1用户聊天。该功能是创建聊天/查找现有聊天,并返回其ID。 现在,我得到的作为返回值的和不知道为什么。除了返回之外,该函数还能正常工作。 我有两个功能。一个是React类组件生命周期方法,另一个是我的firebase异步

  • 我在Sequelize的节点8上。js 当尝试使用时,出现以下错误。 代码: 获取以下错误: 我做错了什么?