Я впервые пытаюсь настроить попробуй поймать для следующего сценария. На данный момент у меня есть один внутри маршрут, в server.js, и он не улавливает, если есть ошибка, исходящий от контролер, то есть user.js.
Я также сомневаюсь, нужно ли мне / могу ли я настроить try-catch также для контроллера.
Пожалуйста, помогите мне правильно это настроить.
server.js:
app.post('/login-user', (req, res) => {
try {
user.loginUser(req.body, (err, jResult) => {
let token = jwt.sign({
user: jResult,
}, "supersecret")
console.info(jResult)
return res.send(token)
})
} catch (err) {
console.info(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.info(jRow)
if (err) {
console.info('BAD, user not logged in')
return fCallback(true, {
status: "INTERNAL SERVER ERROR"
})
}
if (!Object.keys(jRow).length) {
console.info('NOT FOUND')
return fCallback(true, {
status: "NOT FOUND"
})
}
console.info('GREAT, user logged in')
return fCallback(false, jRow)
console.info(jRow)
})
}





Это будет работать не совсем так, как вы думаете ... в вашем app.post ('/ login-user', handler, блок try .. catch не будет обнаруживать ошибки, поскольку обратный вызов будет вызываться асинхронно. Лучшее способ борьбы с ошибками - это общий шаблон в 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.info(jRow)
if (err) {
console.info('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.info('NOT FOUND')
return fCallback(new Error('User not found'), {
status: "INTERNAL SERVER ERROR"
});
}
console.info('GREAT, user logged in')
return fCallback(false, jRow)
console.info(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.info(jResult)
return res.send(token)
})
})
Хммм .. сервер не должен вылетать, если в функции входа пользователя возвращается ошибка. Может быть, попробовать и посмотреть, не вылетит ли он? Просто имейте в виду, что в общем случае включение асинхронного вызова в блок try / catch не сработает!
Если использование try / catch само по себе является жестким требованием (хотя я согласен с Терри, что здесь это неадекватное решение), вы можете рассмотреть возможность использования обещанной версии db с синтаксисом async / await. В этом случае команда try / catch будет работать так же, как и следовало ожидать.
и как будет выглядеть обещанная версия db с синтаксисом async / await?
В этом случае user.loginUser должен вернуть обещание. Вы вызываете внутри асинхронную функцию, например: let result = await user.loginUser (....). . Затем вы можете заключить это в блок try / catch, и он будет работать, как говорит @Szellem.
Если вы используете sqlite3, значит, у него есть версия, в которой используются обещания: npmjs.com/package/sqlite Даже если это что-то еще, большинство библиотек доступа к БД имеют такие версии.
Я понимаю. спасибо за идеи e, но я не знаком с обещаниями, и я хотел бы придерживаться этого способа кодирования, потому что это экзамен, и они не научили нас обещаниям, но мне нужно как-то использовать try-catch. Неужели в этом нет возможности реализовать try-catch?
Попробуйте .. Catch имеет смысл только с синхронным кодом. Большинство вызовов ввода-вывода в Node являются асинхронными, поэтому в большинстве случаев они будут избыточными. Для обработки этих ошибок лучше использовать объект err в обратных вызовах.
Я знаю этот подход, но необходимо использовать try..catch, поскольку в этом случае сервер не выйдет из строя, как это происходит при обработке других ошибок.