У меня есть асинхронная функция, которая вставляет некоторые данные в базу данных (используя 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
}
}
}
Идея состоит в том, чтобы исключение было перехвачено Обещанием так,Я могу отправить сообщение об ошибке вместо успеха.