问题描述
我正在使用 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,该模块决定是否将请求转发到真实服务器或模拟服务器。
您可以通过 register 给 HttpModule
一个配置。如果您想注入 ConfigService
以根据确定您是否为本地的环境变量对其进行配置,请参阅异步配置。配置对象是一个 Axios request config。但是,我没有看到通过配置重定向请求的方法。
HttpModule
使用 axios
,所以另一个选项是 axios interceptors。在请求拦截器中,您可以让它仅在本地运行时覆盖 config.url
。要在应用程序的开头设置拦截器,您可以创建一个注入 MyHttpModule
的模块 HttpService
,并在 onModuleInit
中获取对 axios 实例的引用并设置拦截器。查看我找到的 this example。