从bsync.compare内部“抛出”崩溃节点?

时间:2019-11-11 04:30:26

标签: node.js asynchronous concurrency promise bcrypt

我确定这是一个新手问题,但是现在我只花了一个月左右的时间学习速成/结点/反应。

我只是想进行一个简单的节点登录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(即,按预期的功能)。
 -但是:当提供正确的用户名和不正确的密码时,throw语句(带有注释//为什么此THROW CRASH?)...使节点崩溃。

这是调用堆栈:

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,并在那里处理任何身份验证失败。

有人可以帮我w /这是怎么回事?非常令人沮丧。

PS。仅当在bcrypt.compare回调内 中抛出异常时,才会发生这种崩溃。我认为这与它有关。我已经用Google搜索过了。在这里环顾四周。我现在只是反对。

谢谢! :)

1 个答案:

答案 0 :(得分:0)

请勿throw来自Node的错误。您会注意到bcrypt回调具有一个err参数。将其发送回去,然后按需要处理。