我正在尝试为以下场景第一次设置try-catch。目前,我有一个内部的路线,在server.js,如果有一个不赶错误从未来的控制器,这是user.js的。
我也怀疑我是否需要/可以为控制器设置一个 try-catch 。
请帮我正确设置。
服务器.js:
app.post('/login-user', (req, res) => {
try {
user.loginUser(req.body, (err, jResult) => {
let token = jwt.sign({
user: jResult,
}, "supersecret")
console.log(jResult)
return res.send(token)
})
} catch (err) {
console.log(err)
return res.send(jResult)
}
})
用户.js:
user.loginUser = (jUserData, fCallback) => {
var aData = [
jUserData.email,
jUserData.mobile_number,
1
]
var sQuery = 'SELECT * FROM users WHERE email = ? AND mobile_number = ? AND active = ?'
db.each(sQuery, aData, function (err, jRow) {
console.log(jRow)
if (err) {
console.log('BAD, user not logged in')
return fCallback(true, {
status: "INTERNAL SERVER ERROR"
})
}
if (!Object.keys(jRow).length) {
console.log('NOT FOUND')
return fCallback(true, {
status: "NOT FOUND"
})
}
console.log('GREAT, user logged in')
return fCallback(false, jRow)
console.log(jRow)
})
}
这不会像你想象的那样工作......在你的 app.post('/login-user', handler, the try.. catch 块不会捕获错误,因为回调将被异步调用。最好的这里处理错误的方法是 Node.js 中的一种常见模式。如果在 loginUser 函数中出现错误,请将 err 变量设置为某个值。例如
user.loginUser = (jUserData, fCallback) => {
var aData = [
jUserData.email,
jUserData.mobile_number,
1
]
var sQuery = 'SELECT * FROM users WHERE email = ? AND mobile_number = ? AND active = ?'
db.each(sQuery, aData, function (err, jRow) {
console.log(jRow)
if (err) {
console.log('BAD, user not logged in')
return fCallback(new Error('BAD, user not logged in: ' + err.message), {
status: "INTERNAL SERVER ERROR"
});
}
if (!Object.keys(jRow).length) {
console.log('NOT FOUND')
return fCallback(new Error('User not found'), {
status: "INTERNAL SERVER ERROR"
});
}
console.log('GREAT, user logged in')
return fCallback(false, jRow)
console.log(jRow)
})
}
然后在 app.post 处理程序中检查 err 变量是否为非空:
app.post('/login-user', (req, res) => {
user.loginUser(req.body, (err, jResult) => {
if (err) {
console.error(err.message);
return res.status(500).send('Internal server error');
}
let token = jwt.sign({
user: jResult,
}, "supersecret")
console.log(jResult)
return res.send(token)
})
})
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句