FeathersJS: Как отменить хук аутентификации, используя ошибку из хука после него
Я использовал app.authenticate
на клиенте.
Он вызывал аутентификационную ловушку перед созданием ловушки на сервере.
Я импортировал из 'перо-аутентификации-управления.hook' как verifyHooks
,
Перед тем как создать крючок:
app.service('authentication').hooks({
before: {
create: [
authentication.hooks.authenticate(config.strategies),
async context => {
const { app, data } = context;
await app.service('users').find({
query: {
usernameUpperCase: data.username.toUpperCase(),
$limit: 1
}
})
.then(async (user) => {
await user.data.map(async data => {
if(!data.isVerified) {
await console.log('HELLO FROM ABOVE.');
//await v.validationError('Verify Email. A token link has been sent to your email.');
}
});
})
.catch(err => v.validationError(err));
},
verifyHooks.isVerified()
],
3 крючка в порядке были:
1. аутентификация
2. мой крюк
3. isVerified()
хук проверки электронной почты от управления аутентификацией перьев
На клиенте обещание аутентификации будет отклонено, когда isVerified()
Хук активирован, даже если был после хука аутентификации.
Если бы я удалил isVerified()
крюк, обещание аутентификации будет разрешено.
Как мне сделать мой крюк, второй крюк, вести себя как isVerified()
так что обещание аутентификации на клиенте будет отклонено?
1 ответ
Первое, что вы делаете свою жизнь сложнее, используя async/await
не так, как задумано. Идея состоит в том, чтобы не писать все эти .then
а также .catch
обработчики.
.catch
обработчик также, вероятно, где актуальная проблема. Если .catch
(в твоем случае v.validationError(err)
) не отклоняет и не выдает ошибку, обещание будет успешно выполнено. С помощью async/await
правильный путь и Promise.all
чтобы дождаться шагов асинхронной проверки, а затем повторно выдать ошибку проверки, сделайте это:
app.service('authentication').hooks({
before: {
create: [
authentication.hooks.authenticate(config.strategies),
async context => {
const { app, data } = context;
const user = await app.service('users').find({
query: {
usernameUpperCase: data.username.toUpperCase(),
$limit: 1
}
});
try {
await Promise.all(user.data.map(async data => {
if(!data.isVerified) {
await console.log('HELLO FROM ABOVE.');
//await v.validationError('Verify Email. A token link has been sent to your email.');
}
});
} catch(err) {
throw v.validationError(err);
}
},