Как вернуть неавторизованный ответ от перед хуком в перьяхJS - PullRequest
0 голосов
/ 25 июня 2018

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

Вот как выглядит мой код:

1.Функция, которая проверяетесли приложение запрещено для пользователя, отправившего запрос:

        function isAppForbidden(hook) {
          let forbiddenApps = [];
          hook.app.services.settings.find({
            query: {
              $limit: 1,
              $sort: {
                createdAt: -1
              }
            }
          }).then(res => {
            let array = hook.params.user.hiddenApps;
            if(array.indexOf('qualitydocs') >= 0 || res.data[0].forbiddenApps.indexOf('qualitydocs') >= 0) {
              hook.response = Promise.reject({error: '401 Unauthorized'}); 
                 //this part is important, the rest not so much    
                //what im expecting to do here is just to return unauthorized response                                                  
            }
          });
          return hook;
        }

Но пока это просто выдает ошибку на бэкэнде, например:
"error: необработанный отказ в: Promise Promise {{error: {code: '401 ', сообщение:' Unauthorized '}}} code = 401, message = Unauthorized "

И интерфейс по-прежнему получает успешный ответ (200 с запрошенными данными)

И я просто вызываю эту функцию вперед хуками:

  before: {
    all: [
      authenticate('jwt'),
      hook => includeBefore(hook),
      hook => isAppForbidden(hook) //here, rest is not important
    ],
    find: [],
    get: [],
    create: [(hook) => {
      hook.data.authorId = hook.params.user.id;
    }],
    update: [],
    patch: [],
    remove: []
  },

ответ, который я ожидаю получить, выглядит примерно так: enter image description here

1 Ответ

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

Нашел решение ... ключ заключался в том, чтобы обернуть содержимое функции в обещание ... так что теперь это выглядит так:

function isAppForbidden(hook) {
  return new Promise((resolve, reject) => {
    hook.app.services.settings.find({
      query: {
        $limit: 1,
        $sort: {
          createdAt: -1
        }
      }
    }).then(res => {
      if (hook.params.user.hiddenApps.indexOf('qualitydocs') >= 0 || res.data[0].forbiddenApps.indexOf('qualitydocs') >= 0) {
        reject(new errors.NotAuthenticated());
      } else {
        resolve();
      }
    })
  })
}

и работает как брелок

enter image description here

...