FeathersJS:如何使用钩子后面的错误取消身份验证钩子

时间:2018-04-17 04:11:10

标签: promise async-await feathersjs feathers-authentication feathers-hook

我在客户端上使用了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(),这样客户端的认证承诺就会被拒绝?

1 个答案:

答案 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);
          }
        },