范围问题,参考传递或其他问题?

时间:2019-05-14 19:13:10

标签: javascript node.js express

我正在构建一个expressJS应用程序,并希望使其非常容易添加端点。所以我有一个Endpoint类,可以处理很多东西,包括为Express Router提供基本的CRUD功能

但是,当我实例化多个端点并调用与它们的路由器相关联的功能时,就像它们始终在执行我首先实例化的任何端点中定义的功能一样。

此处的设置未使用Express,而是说明了相同的问题。

我没有做太多尝试,接受将问题简化为演示该问题所需的最低限度的代码。

您可以查看下面的代码,或查看https://repl.it/@SethGreen1/WhoppingJuniorTerabyte

这是index.js文件,可启动所有操作:

const Router = require('./router.js');
const Endpoint = require('./endpoint.js');

const AppleEndpoint = new Endpoint("Apple");

const OrangeEndpoint = new Endpoint("Orange");

const AppleRouter = AppleEndpoint.getRouter();

const OrangeRouter = OrangeEndpoint.getRouter();

AppleRouter.executeRoute("get");

OrangeRouter.executeRoute("get");

然后,router.js:

class Router {

    constructor() {
      this.routes = [];
    }

    addRoute(name, func){
      this.routes[name] = func;
    }

    executeRoute(name){
      this.routes[name]();
    }
}

module.exports = new Router();

最后,是endpoint.js

const Router = require('./router.js');

class Endpoint {

    constructor(name) {
        this.name = name;
    }

    getRouter() {

      Router.addRoute("get", () => {
        console.log(this.name);
      });
      return Router;
    }

    getName() {
      console.log(this.name);
    }
}

module.exports = Endpoint;

我希望此代码可以打印:

Apple
Orange

它正在打印:

Orange
Orange

1 个答案:

答案 0 :(得分:0)

您要在自己的文件中实例化Router类,从而创建一个 singleton

  

单例确保一个类只有一个实例,并提供对其的全局访问点。

为避免这种情况,您需要在端点constructor上实例化它。见下文

Enpoint.js

const Router = require('./router.js')

class Endpoint {
  constructor (name) {
    this.name = name
    this.router = new Router()
  }

  getRouter () {
    this.router.addRoute('get', () => {
      console.log(this.name)
    })
    return this.router
  }

  getName () {
    console.log(this.name)
  }
}

module.exports = Endpoint

Router.js

class Router {
  constructor () {
    this.routes = []
  }

  addRoute (name, func) {
    this.routes[name] = func
  }

  executeRoute (name) {
    this.routes[name]()
  }
}

module.exports = Router