Как Promises работает в node / feathersjs? - PullRequest
0 голосов
/ 26 июня 2018

Я сделал такую ​​функцию, которая должна проверять, запрещен ли модуль для текущего пользователя. Если это так - верните ошибку, если нет - тогда пусть он сделает остальную часть хуков / перейдет к маршруту 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: []
  },

На моей локальной машине все работает просто отлично. Если модуль запрещен, я получаю ошибку Forbiden, если нет, то получаю данные с маршрута. Но на моей производственной машине это не работает таким образом, если модуль НЕ запрещен (без ошибок), я не получаю никакого ответа, как если бы он попал в какой-то цикл в части 'resol ()' ?? Является ли это возможным? это обещание выглядит хорошо для вас?

Я знаю его странный вопрос, но я не знаю, с чего начать, поскольку он прекрасно работает локально и не вызывает ошибок в работе (за исключением того, что он ломает целое приложение, больше нет ответов, пока вы не перезагрузите страницу).

1 Ответ

0 голосов
/ 27 июня 2018

Проблема в том, что если res.data.length <= 0, ваше обещание никогда не разрешится. В общем, при использовании функциональности Feathers вам никогда не придется звонить 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: []
  },
...