我正在构建一个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
答案 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