Я работаю над этим 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 не может решить.