我在客户端上使用了app.authenticate
。
它在服务器上创建钩子之前调用了身份验证钩子
我从羽毛认证 - manage-manage.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个钩子是:
认证
我的钩子
3.来自羽毛认证管理的isVerified()
电子邮件验证挂钩
在客户端,即使在身份验证挂钩之后,isVerified()
挂钩激活时也会拒绝身份验证承诺。
如果我删除isVerified()
挂钩,则验证承诺将解决
如何使我的钩子(第二个钩子)表现得像isVerified()
,这样客户端的认证承诺就会被拒绝?
答案 0 :(得分: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);
}
},