Json-server 模拟 API 而不是调用

Posted

技术标签:

【中文标题】Json-server 模拟 API 而不是调用【英文标题】:Json-server mocking API instead of calls 【发布时间】:2021-09-05 14:58:56 【问题描述】:

我正在使用 NestJS (NodeJS) 创建一个 API,为了在本地环境中运行它而不运行所有外部 API,我想在我的 API 运行时模拟对外部 API 的调用。

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

模拟服务器.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,
      static: 'static',
    ),
    router(db),
    jsonServer.rewriter(routesJSON),
  );

  app.use('/api', 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 本身

【问题讨论】:

【参考方案1】:

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

您可以通过register 为HttpModule 提供配置。如果您想注入 ConfigService 以根据确定您是否在本地的环境变量来配置它,请参阅异步配置。配置对象是Axios request config。但是,我看不到通过配置重定向请求的方法。

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

【讨论】:

感谢您的帖子,我实际上是使用拦截器使其工作的,以便更准确地供将来参考;我使用 HttpModule 作为拦截器。首先,我检查它是否在正确的模拟环境中运行,如果是,我运行拦截器。拦截器将使用httpService.axiosRef.interceptors.request.use 拦截并将 URL 更改为 mock 的服务器 URL。

以上是关于Json-server 模拟 API 而不是调用的主要内容,如果未能解决你的问题,请参考以下文章

用JSON-server模拟REST API

json-server模拟REST API

Vue.js(15)之 json-server搭建模拟的API服务器

使用 json-server 来创建一个模拟 API

Json-server 创建模拟API服务器

如何调用模拟另一个用户而不是 SYSTEM 的函数