'throw' изнутри bsync.compare аварийно завершает работу узла? - PullRequest
0 голосов
/ 11 ноября 2019

Я уверен, что это вопрос новичка, но я только сейчас изучал экспресс / нод / реакцию в течение месяца или около того.

Я просто пытаюсь сделатьпростой вход в систему вызов REST API. Вот фрагмент кода с некоторыми «псевдоизуцированными» неважными частями для краткости:

server.post('/signin', (request, response) => {
    const {user_email, password} = request.body

    // query db for user validation
    db('user_login')
    /* knex query building, blah blah blah */
    .then(res => {
        if (res.length == 0) {
            // if res.length == 0, user not found
            throw new Error("bad credentials")
        } else if (res.length > 1) {
            // if res.length > 1, duplicate user found - shouldn't ever happen
            throw new Error("CRITICAL: database error")
        } else {
            // everything should be ok - pass res on to bcrypt
            return res
        }
    })
    .then(res => {
        // bcrypt.compare doesn't return a promise because it is being given a cb
        bcrypt.compare(password, res[0].pw_hash, (err, match) => {
            if (match) {
                // delete pw_hash from any possible response(),
                // don't give client more info than it needs
                delete res[0].pw_hash

                // we have a match! inform the client
                response.json(res[0])
            } else {
                // we don't have a match
                throw new Error("bad credentials")  // WHY DOES THIS THROW CRASH!??!?!!?!?
            }
        })
    })
    // WHY ISNT THIS REACHED WHEN THERE'S A PASSWORD MISMATCH?
    .catch(err => {
        console.error('signin error: ', err)
        response.status(403).json({
            name: err.message,
            severity: 'auth error',
            code: 403
        })
    })
})

Хорошо, так:
- Когда указано правильное имя пользователя и правильный пароль, он функционирует как ожидалось.
- Когда указано неверное имя пользователя, достигается .catch (т. Е. Функционирует, как и ожидалось).
- НО: когда задано правильное имя пользователя и неверный пароль, бросокоператор (с комментарием // ПОЧЕМУ ЭТО БРОСАЛ?) ... сбой узла.

Вот стек вызовов:

C:\.............\server.js:83
                throw new Error("bad credentials")      // WHY DOES THIS THROW CRASH!??!?!!?!?
                ^

Error: bad credentials
    at C:\.............\server.js:83:23
    at C:\.............\node_modules\bcrypt-nodejs\bCrypt.js:689:3
    at processTicksAndRejections (internal/process/task_queues.js:75:11)
[nodemon] app crashed - waiting for file changes before starting...

Я мог бы "обмануть" и просто сделать response.status (403) .... вместо этого броска. Но, на мой взгляд, выброс этой ошибки должен перейти к .catch и обработать любую ошибку аутентификации там.

Может кто-нибудь помочь мне с / что здесь происходит? Это очень расстраивает.

PS. Похоже, этот сбой происходит только тогда, когда бросок равен в пределах обратного вызова bcrypt.compare. Я полагаю, что это как-то связано с этим. Я погуглил ... Я осмотрелся здесь ... Я обернул вещи в блоки try / catch. Сейчас я просто бьюсь головой об это.

Спасибо! :)

...