Настройка try-catch в node.js

Я впервые пытаюсь настроить попробуй поймать для следующего сценария. На данный момент у меня есть один внутри маршрут, в 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)
    })
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это будет работать не совсем так, как вы думаете ... в вашем 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, поскольку в этом случае сервер не выйдет из строя, как это происходит при обработке других ошибок.

July333 07.05.2018 20:55

Хммм .. сервер не должен вылетать, если в функции входа пользователя возвращается ошибка. Может быть, попробовать и посмотреть, не вылетит ли он? Просто имейте в виду, что в общем случае включение асинхронного вызова в блок try / catch не сработает!

Terry Lennox 07.05.2018 20:59

Если использование try / catch само по себе является жестким требованием (хотя я согласен с Терри, что здесь это неадекватное решение), вы можете рассмотреть возможность использования обещанной версии db с синтаксисом async / await. В этом случае команда try / catch будет работать так же, как и следовало ожидать.

Szellem 07.05.2018 21:05

и как будет выглядеть обещанная версия db с синтаксисом async / await?

July333 07.05.2018 21:18

В этом случае user.loginUser должен вернуть обещание. Вы вызываете внутри асинхронную функцию, например: let result = await user.loginUser (....). . Затем вы можете заключить это в блок try / catch, и он будет работать, как говорит @Szellem.

Terry Lennox 07.05.2018 21:20

Если вы используете sqlite3, значит, у него есть версия, в которой используются обещания: npmjs.com/package/sqlite Даже если это что-то еще, большинство библиотек доступа к БД имеют такие версии.

Szellem 07.05.2018 21:52

Я понимаю. спасибо за идеи e, но я не знаком с обещаниями, и я хотел бы придерживаться этого способа кодирования, потому что это экзамен, и они не научили нас обещаниям, но мне нужно как-то использовать try-catch. Неужели в этом нет возможности реализовать try-catch?

July333 08.05.2018 11:20

Попробуйте .. Catch имеет смысл только с синхронным кодом. Большинство вызовов ввода-вывода в Node являются асинхронными, поэтому в большинстве случаев они будут избыточными. Для обработки этих ошибок лучше использовать объект err в обратных вызовах.

Terry Lennox 08.05.2018 11:40

Другие вопросы по теме