javascript - 我怎样才能让 unshift 方法和这个基于 Promise 的代码在本教程中工作?
问题描述
我正在使用 RBAC、JWT、存储库和 MVC 模式开发这个 Node.js REST API。看来作者不再活跃于该帖子。有第 1部分、第 2部分和第 3 部分。第 1 部分和第 2 部分工作正常。但是当我进入第三部分时,我遇到了两个文件的问题。
问题 1:JAVASCRIPT UNSHIFT 方法
当我在第 3 部分的 appBase.js 文件的第 26 到 29 行添加 unshift 方法时,当我在邮递员上测试它时,代码拒绝在加载时解析。但是当我删除它时,它工作正常。在第 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;
同时,当我使用第 1 部分中的 getURI 函数时,它可以工作。所以,我认为这是因为 getURI 函数无法解析。
解决方案
推荐阅读
- java - JavaFX - 如何在舞台上居中 JFXpopup 和弹出窗口的动态大小
- typescript - 带有@injectable 和普通参数的打字稿构造函数
- sql - Oracle SQL 连接和计数案例
- wpf - 删除每隔一个像素行
- macos - Mac OS 低级窗口框架
- reactjs - 如何在 DevExtreme React Grid 的单元格内添加按钮?
- mysql - 存储过程中查询的未知列错误 (1054),在查询窗口中工作
- ruby-on-rails - ActiveRecord::Migration 类名中的方括号?
- php - 将许多文件上传到服务器的最佳方法
- json - JSON(在 SOAP UI 中——测试 WSO2 服务)