我确定这是一个新手问题,但是现在我只花了一个月左右的时间学习速成/结点/反应。
我只是想进行一个简单的节点登录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搜索过了。在这里环顾四周。我现在只是反对。
谢谢! :)
答案 0 :(得分:0)
请勿throw
来自Node的错误。您会注意到bcrypt回调具有一个err
参数。将其发送回去,然后按需要处理。