Express.js: try/catch的catch中的响应永远不会被发送



我正在尝试使用Express.js和mySQL实现基本的用户注册流。这是我目前拥有的代码(为了简洁而删除):

register(app, db) {
app.post('/register', (req, res) => {
let email = req.body.email
let password = req.body.password

try {
// add the user to the database
var q_params = [email, bcrypt.hashSync(password, 9)]
db.query("INSERT INTO users VALUES (?, ?)", q_params, (err) => {
if (err) {
throw err
}
})
} catch (err) {
// respond with an error if one is encountered
res.json({
success: false,
msg: err
})
return
}
// respond with success if everything else goes ok
res.json({
success: true,
email: email
})
});
}

问题是,无论try块中的代码结果如何,我总是得到success: true。为什么从来没有触发错误响应?有没有更好的方法来处理这种情况?

我假设问题是没有等待db.query()函数完成执行。它不是异步的,也不是等待函数解析。所以最后一个res.json({})马上被击中。

我会尝试重写代码,要么使用承诺或使用回调函数传递给.query(),也许是这样的:

app.post('/register', (req, res) => {
let email = req.body.email
let password = req.body.password      

// add the user to the database
var q_params = [email, bcrypt.hashSync(password, 9)]
db.query("INSERT INTO users VALUES (?, ?)", q_params, (err) => {
if (err) {
return res.json({
success: false,
msg: err
});
}
res.json({
success: true,
email: email
});
});
});

最新更新