Он может перехватить только синхронные исключения.
Простой пример:
let p = new Promise((resolve, reject) => {
setTimeout(() => {
throw 'WTF';
}, 0);
});
p.catch( console.log );
Ну и вообще, очень странно видеть создание промиса в котором не вызываются ни resolve, ни reject.
Правильно должно быть примерно так:
let userInsert = new Promise((resolve, reject) => {
db.query(
'INSERT INTO users (email, password) VALUES (?, ?)',
[user.email, user.password],
(err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
}
)
});