1。不好的方法:鸭打字
最直接的方法是使用一种称为“鸭子打字”的技术来讲述您要处理的对象。查看res
差异感兴趣,以便能够分辨出它们,因此搜索另一个框架没有的特殊功能。
示例检查:
function isExpress(res) {
return (typeof res === 'object' && typeof res.sendFile === 'function');
}
function isFastify(res) {
return (typeof res === 'object' && typeof res.hasHeader === 'function');
}
wow,有一个问题:如果您获得了一个由express.js的中间件扩展或for for for for for for for for for for for for for for aft the offere of for添加该属性怎么办?然后,根据您的if-elses的顺序,您可能会混淆另一个。
2。不太惊人的方法:自己装饰物体
如果我们能分开对象,无论使用哪些中间Wares,都会更好 - 这样添加的功能不会破坏我们的类型识别逻辑。 Instead,我们可以使用特殊的额外属性有目的地扩展
res
对象,从而显而易见,无论我们要处理Express还是快速处理该属性。为此,我们需要确保:
Exppress将用一个说“我表达”的属性进行装饰。 Fordify将用一个说“我快速化”的属性装饰res
res
,然后您可以参考
res
并检查您直接为自己留下的提示。
制剂设计模式解决这个问题 - 具有说明常见API的图层,并隐藏了具有不同可能实现的复杂性。例如,假设您的处理程序需要请求主体和标头,无论框架如何,您都需要能够通过JSON做出响应。然后,您可以将处理程序签名定义为:
const FRAMEWORK_TYPE = Symbol('type of framework that res comes from');
expressApp.use(function(req, res, next) {
res[FRAMEWORK_TYPE] = 'express';
next();
});
fastifyApp.decorateReply(FRAMEWORK_TYPE, 'fastify');
next,从两个框架中调用该处理程序。您会注意到,在Express的情况下,您需要参考
res[FRAMEWORK_TYPE]
和
({ body, headers }) => responseObject
的不同部分,并将其快速拨打以正确调用处理程序。另外,如果要快速,您将只能
req
,但是对于Express,您可能需要做res
。 这种方式,您可以从基础架构层(Web Server)中解除业务逻辑(处理程序)。
这是您可以检查Nestjs应用程序是否正在使用Express或Fastify的方法:
1。最简单的是检查Promise.resolve(responseObject)
文件。
express(这是Nestjs的默认值):
res.json(responseObject)
fastify(需要明确添加快速适配器)
main.ts
地,您还可以在运行时检查哪个适配器正在使用
main.ts
const app = await NestFactory.create(AppModule);
const app = await NestFactory.create(AppModule, new FastifyAdapter());
HttpAdapterHost
@nestjs/core
httpAdapterHost.httpAdapter.constructor.name
当然,即使您不使用其中一种方法,这种方法也无法使用。向PNPM用户注释:即使我使用
npm list express;
npm list fastify;