验证响应是明确的还是fastify

问题描述 投票:0回答:2
在nodejs中,使用javaScript i具有一个可以是快速响应的“ res”对象,是否有任何方法可以检查这两个响应中的哪一个?

javascript node.js express fastify
2个回答
2
投票

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

并检查您直接为自己留下的提示。
  • 3。干净的方式:设计模式
    
    
  • 您制定的原始问题的方式是:如何检查我们要处理的实例类型。但是,此检查的目的最有可能能够将不同的框架(表达和快速化)与单个代码(处理程序)(处理程序)进行集成。
  • 通常用
    制剂设计模式解决这个问题 - 具有说明常见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

(需要明确添加快速适配器)


0
投票
main.ts

地,您还可以在运行时检查哪个适配器正在使用

main.ts
  const app = await NestFactory.create(AppModule);

const app = await NestFactory.create(AppModule, new FastifyAdapter());

HttpAdapterHost

    @nestjs/core
  • 2。检查套件中的依赖项。 将两个命令在终端上运行并检查输出。使用的一个应输出一个很大的依赖树。
  • httpAdapterHost.httpAdapter.constructor.name
当然,即使您不使用其中一种方法,这种方法也无法使用。
向PNPM用户注释:即使我使用
    npm list express; npm list fastify;
  • 作为软件包管理器,我也只能使用NPM输出树的依赖性。我不确定这里发生了什么,但是在同一情况下向某人指出可能会有所帮助。
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.