如何在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
相关产品推荐
相关产品推荐

