Express.js:从未发送 try/catch 中的响应
Express.js: Reponse in catch of try/catch is never sent
我正在尝试使用 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
});
});
});
我正在尝试使用 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
});
});
});