代码之家  ›  专栏  ›  技术社区  ›  Kerim092

承诺在node/featherJS中是如何工作的?

  •  0
  • Kerim092  · 技术社区  · 7 年前

    我做了这样的功能,应该检查当前用户是否禁止使用模块。如果是-返回错误,如果不是-那么让他做其余的钩子/继续API路由。在服务钩子中调用此方法。

    function isAppForbidden(hook) {
      return new Promise((resolve, reject) => {
        hook.app.services.settings.find({
          query: {
            $limit: 1,
            $sort: {
              createdAt: -1
            }
          },
          user: {
            roleId: hook.params.user.roleId
          }
        }).then(res => {
          if(res.data.length > 0) {
            let userHiddenApps = hook.params.user.hiddenApps || [];
            let globalHiddenApps = res.data[0].forbiddenApps || [];
            if (userHiddenApps.indexOf('qualitydocs') >= 0 || globalHiddenApps.indexOf('qualitydocs') >= 0) {
              reject(new errors.Forbidden()); //throws error for forbidden moduels
            }
            resolve();
          }
        })
      })
    }
    
    before: {
        all: [
          authenticate('jwt'),
          hook => includeBefore(hook),
          hook => isAppForbidden(hook)
        ],
        find: [],
        get: [],
        create: [(hook) => {
          hook.data.authorId = hook.params.user.id;
        }],
        update: [],
        patch: [],
        remove: []
      },
    

    在我的本地机器上,一切正常。如果模块被禁止,我会得到禁止错误,如果不是,我会从路由获取数据。但在我的生产机器上,它不能这样工作,如果模块没有被禁止(没有错误),我就不能接收到任何响应,就好像它结束在“resolve()”部分的某种循环中一样?有可能吗?你觉得这个承诺不错吗?

    我知道这个奇怪的问题,但我不知道从哪里开始,因为它在本地工作得很好,在生产上没有错误(除了它破坏了整个应用程序,在你重新加载页面之前,不再有响应)。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Daff    7 年前

    问题是如果 res.data.length <= 0 你的承诺永远不会兑现。一般来说,使用Feather功能时,您不必调用 new Promise 你自己,因为一切都已经兑现了承诺。你可以通过使用 async/await 这将使代码更容易执行并完全避免您的问题:

    async function isAppForbidden(hook) {
      const res = await hook.app.service('settings').find({
        query: {
          $limit: 1,
          $sort: {
            createdAt: -1
          }
        },
        user: {
          roleId: hook.params.user.roleId
        }
      });
    
      if(res.data.length > 0) {
        let userHiddenApps = hook.params.user.hiddenApps || [];
        let globalHiddenApps = res.data[0].forbiddenApps || [];
    
        if (userHiddenApps.indexOf('qualitydocs') >= 0 || globalHiddenApps.indexOf('qualitydocs') >= 0) {
          throw new errors.Forbidden(); //throws error for forbidden moduels
        }
      }
    
      return hook;
    }
    
    before: {
        all: [
          authenticate('jwt'),
          includeBefore,
          isAppForbidden
        ],
        find: [],
        get: [],
        create: [(hook) => {
          hook.data.authorId = hook.params.user.id;
        }],
        update: [],
        patch: [],
        remove: []
      },