Ошибка не выдается внутри асинхронной функции - PullRequest
0 голосов
/ 02 июля 2019

У меня есть асинхронная функция, которая вставляет некоторые данные в базу данных (используя mariadb ).Эта вставка может завершиться ошибкой из-за дублирования уникального ключа, поэтому она выдаст ошибку (и это действительно так), но когда я пытаюсь снова ее выбросить, чтобы перехватить через Обещание, она не работает;Кажется, что это всегда заканчивается успешным случаем, даже если он выдал ошибку.

Я попытался изменить порядок then / catch, и я использовал reject(err); вместо throw 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
        }
    }
} 

Идея состоит в том, чтобы исключение было перехвачено Обещанием так,Я могу отправить сообщение об ошибке вместо успеха.

1 Ответ

2 голосов
/ 02 июля 2019

Проблема в вашем заявлении на возврат внутри вашего finally. В функции 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
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...