javascript - express JS : Cannot read property 'lazyrouter' of undefined

标签 javascript node.js express

我正在围绕 Express JS 创建一个抽象层,但我遇到了一个问题。考虑以下代码(见底部),当调用 registerRoute 并点击该行时:

expressFnc(route, (req: any, res: any, next: any) => dummy(req, res, next));

我遇到了错误:

Cannot read property 'lazyrouter' of undefined

在这种情况下,我假设“this”适用于 ExpressJS (lib/application.js:479:10)。

const express = require("express");

export class ExpressHttpHost implements IHttpHost {
  private host: any = express();
  private contentResolver?: ContentResolver;

  public configure(contentResolver: ContentResolver): void {
    this.contentResolver = contentResolver;
  }

  public registerRoute(
    route: string,
    verb: HttpVerb,
    handler: (request: HttpRequest) => HttpResponse,
  ): void {
    switch (verb) {
      case HttpVerb.Get:
        this.createDummyRequest(this.host.get, route, handler);
        break;
      case HttpVerb.Delete:
        this.createDummyRequest(this.host.delete, route, handler);
        break;
      case HttpVerb.Options:
        this.createDummyRequest(this.host.options, route, handler);
        break;
      case HttpVerb.Patch:
        this.createDummyRequest(this.host.patch, route, handler);
        break;
      case HttpVerb.Post:
        this.createDummyRequest(this.host.post, route, handler);
        break;
      case HttpVerb.Put:
        this.createDummyRequest(this.host.put, route, handler);
        break;
      case HttpVerb.All:
        this.createDummyRequest(this.host.get, route, handler);
        this.createDummyRequest(this.host.delete, route, handler);
        this.createDummyRequest(this.host.options, route, handler);
        this.createDummyRequest(this.host.patch, route, handler);
        this.createDummyRequest(this.host.post, route, handler);
        this.createDummyRequest(this.host.put, route, handler);
        break;
      default:
        throw new Error("Verb is not supported.");
    }
  }

  public start(options: IHttpHostOptions): void {
    this.host.listen(options.port ? options.port : 80);
  }

  private createHttpRequest(expressReq: any): HttpRequest {
    return new HttpRequest(
      expressReq.headers,
      expressReq.params,
      expressReq.body,
    );
  }

  private createDummyRequest(expressFnc: any, route: string, handler: (request: HttpRequest) => HttpResponse): void {
    const dummy = (expressReq: any, expressRes: any, next: any) => {
      const httpRequest = this.createHttpRequest(expressReq);

      const response = handler(httpRequest);
      const responseStatus = response.status();
      const responseMimeType = response.mimeType();
      const responseContent = response.content(this.contentResolver);

      expressRes.set("Content-Type", responseMimeType);
      expressRes.status(responseStatus);
      expressRes.send(responseContent);
      next();
    };
    expressFnc(route, (req: any, res: any, next: any) => dummy(req, res, next));
  }
}

最佳答案

这可能会发生,因为 express 函数在作为参数传递时松散地引用了宿主对象。尝试手动绑定(bind)它们。请参阅开关中的以下绑定(bind):

const express = require("express");

export class ExpressHttpHost implements IHttpHost {
  private host: any = express();
  private contentResolver?: ContentResolver;

  public configure(contentResolver: ContentResolver): void {
    this.contentResolver = contentResolver;
  }

  public registerRoute(
    route: string,
    verb: HttpVerb,
    handler: (request: HttpRequest) => HttpResponse,
  ): void {
    switch (verb) {
      case HttpVerb.Get:
        this.createDummyRequest(this.host.get.bind(this.host), route, handler);
        break;
      case HttpVerb.Delete:
        this.createDummyRequest(this.host.delete.bind(this.host), route, handler);
        break;
      case HttpVerb.Options:
        this.createDummyRequest(this.host.options.bind(this.host), route, handler);
        break;
      case HttpVerb.Patch:
        this.createDummyRequest(this.host.patch.bind(this.host), route, handler);
        break;
      case HttpVerb.Post:
        this.createDummyRequest(this.host.post.bind(this.host), route, handler);
        break;
      case HttpVerb.Put:
        this.createDummyRequest(this.host.put.bind(this.host), route, handler);
        break;
      case HttpVerb.All:
        this.createDummyRequest(this.host.get.bind(this.host), route, handler);
        this.createDummyRequest(this.host.delete.bind(this.host), route, handler);
        this.createDummyRequest(this.host.options.bind(this.host), route, handler);
        this.createDummyRequest(this.host.patch.bind(this.host), route, handler);
        this.createDummyRequest(this.host.post.bind(this.host), route, handler);
        this.createDummyRequest(this.host.put.bind(this.host), route, handler);
        break;
      default:
        throw new Error("Verb is not supported.");
    }
  }

  public start(options: IHttpHostOptions): void {
    this.host.listen(options.port ? options.port : 80);
  }

  private createHttpRequest(expressReq: any): HttpRequest {
    return new HttpRequest(
      expressReq.headers,
      expressReq.params,
      expressReq.body,
    );
  }

  private createDummyRequest(expressFnc: any, route: string, handler: (request: HttpRequest) => HttpResponse): void {
    const dummy = (expressReq: any, expressRes: any, next: any) => {
      const httpRequest = this.createHttpRequest(expressReq);

      const response = handler(httpRequest);
      const responseStatus = response.status();
      const responseMimeType = response.mimeType();
      const responseContent = response.content(this.contentResolver);

      expressRes.set("Content-Type", responseMimeType);
      expressRes.status(responseStatus);
      expressRes.send(responseContent);
      next();
    };
    expressFnc(route, (req: any, res: any, next: any) => dummy(req, res, next));
  }
}

关于javascript - express JS : Cannot read property 'lazyrouter' of undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56473950/

相关文章:

node.js - npm 安装 mmmagic 失败

ios - 服务器端如何将来自同一手机的 2 个不同请求解释为具有 2 个不同的 IP?

javascript - 如何将数据发布和解析到 Node express

javascript - Electron:如何在另一个文件中引用全局BrowserWindow对象?

javascript - 如何简单地实现Google Logout之类的 "click anywhere to close"之类的功能?

android - 如何将纬度和经度从一个用户发送到另一个用户 - android

node.js - 如何将 Google Analytics 跟踪代码与 node-express 应用程序一起使用?

c# - 将 C# 类转换为 JavaScript

javascript - 在 JavaScript 中的表单字段旁边打印文本

javascript - 使用node.js意外的 token 输出json文件