Попробуйте перехватить настройки в node.js - PullRequest
0 голосов
/ 07 мая 2018

Я впервые пытаюсь настроить try-catch для следующего сценария. На данный момент у меня есть один внутри маршрута , в server.js , и он не ловит, если ошибка * приходит от контроллера *1009* , то есть 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.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)
    })
}

1 Ответ

0 голосов
/ 07 мая 2018

Это не будет работать так, как вы думаете ... в вашем app.post ('/ login-user', обработчик, блок 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.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)
    })    
})
...