Express JS:无法读取未定义属性“lazyrouter”

5
我正在 Express JS 周围创建一个抽象层,并遇到了问题。考虑下面的代码 (见底部),当调用 registerRoute 并触发以下行时:
expressFnc(route, (req: any, res: any, next: any) => dummy(req, res, next));

我遇到了这个错误:

无法读取未定义的 'lazyrouter' 属性

在这个上下文中,我认为“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));
  }
}

你是否遇到了与此问题帖子中概述的类似问题?:https://github.com/expressjs/express/issues/3855 - dusthaines
1
顺便说一句,如果我输错了函数名称并将空值传递给路由器,例如 app.get('/api/route/:param', undefined),我也会遇到这个错误。 - prototype
2个回答

6

这可能是因为当作为参数传递时,express函数失去了对主机对象的引用。试着手动绑定它们回来。请参见下面在switch中的绑定:

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));
  }
}

有人能解释一下为什么会发生这种情况吗?我以为使用()=>可以防止这种情况发生? - NSjonas

1
这个问题也发生在我身上,花了我几个小时和额外的支持才解决。我的建议是仔细阅读编译错误,因为它应该告诉你在你的代码库中哪里引起了错误。
在我的情况下,它是由...引起的。
server.post(`/url/path/to/page`, myMiddleware(), MyClass.myNonExistentFunction);

我的代码库中出现了一个不存在的函数引用,这是在一个复杂的合并过程中发生的。
这个编译错误的问题之一是它没有命名未定义的回调函数 - 在这种情况下是'MyClass.myNonExistentFunction'。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接