You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Controller中注入Rest Router以获取所有API路由列表?

问题:如何在LoopBack 4中获取所有API路由数组?

我需要一个能返回所有API路由数组的接口。尝试注入Rest Router以使用其list方法时,出现以下错误:

The key 'rest.router' is not bound to any value in context RequestContext-y_3kWzd3Ra-inz75ketkRw-5 (context: RequestContext-y_3kWzd3Ra-inz75ketkRw-5, binding: rest.router, resolutionPath: controllers.DiscoveryController --> @DiscoveryController.constructor[0])

我的代码如下:

export class DiscoveryController {
  constructor(@inject(RestBindings.ROUTER) private readonly router: RestRouter) {}

  @get('/discovery')
  @response(200)
  discovery(): [] {
   console.log(this.router.list());
   return [];
  }

}

请问如何正确注入Router以获取所有路由,或者是否有其他可行方法?


解决方案

问题根源

RestBindings.ROUTER的绑定存在于服务器上下文而非请求上下文(RequestContext)中,直接在控制器构造函数中注入会触发找不到绑定的错误。需要通过注入服务器实例来访问路由相关能力。

方法一:通过RestServer获取Router并调用list()

import {inject} from '@loopback/core';
import {RestBindings, RestServer, RestRouter} from '@loopback/rest';
import {get, response} from '@loopback/rest';

export class DiscoveryController {
  constructor(
    @inject(RestBindings.SERVER) private readonly server: RestServer,
  ) {}

  @get('/discovery')
  @response(200)
  async discovery(): Promise<ReturnType<RestRouter['list']>> {
    const router = await this.server.get<RestRouter>('rest.router');
    return router.list();
  }
}

方法二:直接调用RestServer的listRoutes()方法

RestServer本身提供了listRoutes()方法,无需手动获取Router,实现更简洁:

import {inject} from '@loopback/core';
import {RestBindings, RestServer} from '@loopback/rest';
import {get, response} from '@loopback/rest';

export class DiscoveryController {
  constructor(
    @inject(RestBindings.SERVER) private readonly server: RestServer,
  ) {}

  @get('/discovery')
  @response(200)
  async discovery() {
    return this.server.listRoutes();
  }
}

内容的提问来源于stack exchange,提问作者Thomas CARBUCCIA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:48:21