我正在使用NestJS(NodeJS(制作一个API,为了在本地环境中运行它而不运行所有外部API,我想在API运行时模拟对外部API的调用。
为了做到这一点,我选择Json服务器来做,下面是代码:
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,
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本身并没有嘲笑使用数据库和给Json-server的路由对外部API的调用。
关于如何在运行时模拟API对外部API的调用,有什么想法吗?或者如何使json-server模拟调用httpService仅调用,而不是API本身
我以前没有尝试过,但我认为您要么需要将现有的HttpModule配置为有时转发调用,要么用一个新模块包装HttpModule,该模块决定是否将请求转发到真实服务器或模拟服务器。
您可以通过寄存器给HttpModule
一个配置。如果您想注入ConfigService
以基于环境变量进行配置,请参阅异步配置,该环境变量决定您是否是本地的。config对象是Axios请求配置。然而,我看不到通过配置重定向请求的方法。
HttpModule
使用axios
,所以另一种选择是axios拦截器。在请求拦截器中,您只能让它在本地运行时覆盖config.url
。要在应用程序开始时设置拦截器,可以创建一个注入HttpService
的模块MyHttpModule
,在onModuleInit
中,获取对axios实例的引用并设置拦截器。看看我发现的这个例子。