Как я могу заставить метод unshift и этот код, основанный на обещаниях, работать в этом руководстве? - PullRequest
0 голосов
/ 15 февраля 2020

Я работаю над этим Node.js REST API с шаблоном RBA C, JWT, Repository и MVC. Похоже, автор больше не работает с сообщением. Есть часть 1 , часть 2 и часть 3 . Часть 1 и 2 работает отлично. Но когда я добираюсь до третьей части, у меня возникают проблемы с двумя файлами.

ВОПРОС 1: JAVASCRIPT СПОСОБ СДВИГАНИЯ

Когда я добавил метод unshift в строке 26-29 файла appBase. js в части 3, код отказывается разрешать при загрузке, когда я тестировал его на почтальоне. Но когда я его удаляю, все работает нормально. В части 1 и 2 он не был включен. Из кода метод _createRouteBoundAction теперь применяет проверку подлинности и авторизацию промежуточного программного обеспечения для каждого маршрута приложения. Это означает, что пользователь должен иметь правильный токен JWT для доступа к этим маршрутам. По словам автора, метод unshift предназначался для аутентификации и авторизации пользователя с помощью токена. Почему unshift не работает? Это из-за того, что в него переданы два параметра, например: this.security.authenticate(), this.security.authorise(controllerClass.name, method)

_createRouteBoundAction(controllerClass, httpMethod) {
    const result = [
      (req, res) => {
        this._buildControllerInstance(controllerClass, req, res)[httpMethod]();
      }];

      result.unshift( 
        this.security.authenticate(),
        this.security.authorise(controllerClass.name, httpMethod),
    );

    return result;
  }

ВЫПУСК 2: ФУНКЦИЯ getURI НЕ СМОЛА РАЗРЕШИТЬ

Когда я делаю предложенные изменения в часть 3, функция getURI не удается разрешить в файле URIGenerator. js внутри папки маршрутизации. То есть, когда я тестировал его в Postman, тест продолжал загружаться и не мог разрешиться.

const queryString = require('query-string');
const RoutesCollection = require('./routesCollection');

class URIGenerator {
  constructor(security, role) {
    this.security = security;
    this.role = role;
  }

  getURI(controllerAction, params, id) {
    return new Promise((resolve) => {
      const caArray = controllerAction.split('_');
      const routeData = RoutesCollection[caArray[0]][caArray[1]];
      this.security.hasAccess(this.role, routeData.controller, routeData.action, (err, can) => {
        if (can) {
          const uri = params ? this._bindParams(routeData.uri, params) : routeData.uri;
          resolve({ id: id || routeData.action, method: routeData.method, uri });
        } else {
          resolve(null);
        }
      });
    });
  }

  _bindParams(uri, params) {
    let match;
    let replacement;
    const replacedParams = [];

    while (match = /:([\w_]+)\??/ig.exec(uri)) {
      replacement = params[match[1]].toString() || '';
      if (replacement === '') {
        uri = uri.replace(`/${match[0]}`);
      } else {
        uri = uri.replace(match[0], replacement);
        replacedParams.push(match[1]);
      }
    }

    const paramsForQueryString = {};
    Object.keys(params).forEach((p) => {
      if (!replacedParams.includes(p)) {
        paramsForQueryString[p] = params[p];
      }
    });

    if (Object.keys(paramsForQueryString).length > 0) {
      uri = `${uri}?${queryString.stringify(paramsForQueryString)}`;
    }

    return uri;
  }
}

module.exports = URIGenerator;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...