Я уверен, что это вопрос новичка, но я только сейчас изучал экспресс / нод / реакцию в течение месяца или около того.
Я просто пытаюсь сделатьпростой вход в систему вызов 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. Сейчас я просто бьюсь головой об это.
Спасибо! :)