Json 服务器模拟 API 而不是调用

问题描述

我正在使用 nestJS (NodeJS) 制作 API,为了在本地环境中运行它而不运行所有外部 API,我想在我的 API 运行时模拟对外部 API 的调用

为了做到这一点,我选择了Json-server来做,代码如下:

mockserver.ts:

export async function bootstrap() {
  const app = create();
  app.use(
    defaults({
      logger: true,static: 'static',}),router(dbJSON),jsonServer.rewriter(routesJSON),);

  app.use('/api',router);
}

我也试过:

export async function bootstrap() {
  const app = create();
  app.use(
    defaults({
      logger: true,router(db),router);
  const port = process.env.mockPort ?? 8080;
  app.listen(port);

main.ts :

async function bootstrap() {
  const app = await nestFactory.create(AppModule)

  const mocks = await import('../mocks/server');
  app.use(await mocks.bootstrap(null));

  await app.listen(DEFAULT_HTTP_PORT,DEFAULT_HOST);
}

然而,我的 API 本身被模拟了,而不是使用 db 和提供给 Json-server 的路由来模拟对外部 API 的调用

关于如何在运行时模拟对外部 API 的 API 调用的任何想法?或者如何让 json-server 模拟调用 httpService 调用而不是 API 本身

解决方法

我以前没有尝试过,但我认为您要么需要配置现有的 HttpModule 以有时转发调用,要么用一个新模块包装 HttpModule,该模块决定是否将请求转发到真实服务器或模拟服务器。

您可以通过 registerHttpModule 一个配置。如果您想注入 ConfigService 以根据确定您是否为本地的环境变量对其进行配置,请参阅异步配置。配置对象是一个 Axios request config。但是,我没有看到通过配置重定向请求的方法。

HttpModule 使用 axios,所以另一个选项是 axios interceptors。在请求拦截器中,您可以让它仅在本地运行时覆盖 config.url。要在应用程序的开头设置拦截器,您可以创建一个注入 MyHttpModule 的模块 HttpService,并在 onModuleInit 中获取对 axios 实例的引用并设置拦截器。查看我找到的 this example

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...