首页 > 解决方案 > 我怎样才能让 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 函数无法解析。

标签: javascriptnode.jsclassexpresspromise

解决方案


推荐阅读