Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未在异步函数内引发错误_Javascript_Node.js_Express_Asynchronous - Fatal编程技术网

Javascript 未在异步函数内引发错误

Javascript 未在异步函数内引发错误,javascript,node.js,express,asynchronous,Javascript,Node.js,Express,Asynchronous,我有一个异步函数,它将一些数据插入数据库(使用)。由于重复的唯一密钥,此插入可能会失败,因此它将抛出一个错误(实际上是这样),但当我尝试再次抛出它以通过承诺捕获它时,它不起作用;它似乎总是以一个成功的案例结束,即使它抛出了错误 我尝试更改then/catch顺序,并使用了reject(err)而不是抛出错误但这些都不起作用 以下是帖子声明: router.post('/', function (req, res) { var user = req.body || {}; crea

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

我尝试更改then/catch顺序,并使用了
reject(err)而不是
抛出错误但这些都不起作用

以下是帖子声明:

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捕获该异常,这样我就可以发送错误消息而不是成功。

问题在于
finally
中的return语句。在抛出异常后的
async
函数中,如果捕捉到异常,则抛出
finally
并返回某些内容,而不是抛出异常,将承诺解析为返回值。据我所知,您不需要结束连接的对象作为返回值,这意味着您所要做的就是将函数更改为:

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

问题在于
finally
中的return语句。在抛出异常后的
async
函数中,如果捕捉到异常,则抛出
finally
并返回某些内容,而不是抛出异常,将承诺解析为返回值。据我所知,您不需要结束连接的对象作为返回值,这意味着您所要做的就是将函数更改为:

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

非常感谢。我甚至没有意识到return语句在那里,可能是复制粘贴错误。正如你所说,如果先归还一些东西,承诺会在捕获之前解决。谢谢!我甚至没有意识到return语句在那里,可能是复制粘贴错误。正如你所说的,如果先归还一些东西,承诺将在捕获之前得到解决。