/ / Налаштування Try-catch в node.js - node.js, контролер, маршрути, try-catch

Налаштування try-catch в node.js - node.js, контроллер, маршрути, try-catch

Я намагаюся встановити a спробуй ловити вперше для наступного сценарію. На даний момент я маю один всередині маршрут, в server.js і це не ловить, якщо є помилка виходячи з контролер, який user.js.

Я також сумніваюся, чи потрібно мені / чи можу я налаштувати спробну лову також для контролера.

Будь ласка, допоможіть мені правильно це налаштувати.

server.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)
}
})

user.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)
})
}

Відповіді:

2 для відповіді № 1

Це не працюватиме так, як ти думаєш ..у вашому app.post ("/ login-user", обробник, try .. catch block won "t catch error, оскільки зворотний виклик буде викликатися асинхронно. Найкращий спосіб вирішення помилок - це загальний шаблон у Node .js. Встановіть для змінної err щось, якщо ви отримаєте помилку у функції loginUser

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)
})
})