Javascript 验证响应是快速响应还是快速响应
在NodeJS中,使用Javascript我有一个“res”对象,它可以是Express或fastfy响应,有没有办法检查这两个对象中的哪一个是这个响应?有三种方法可以解决这个问题:糟糕的方法、不那么糟糕的方法和产生实际干净代码的方法 1。糟糕的方法:鸭子打字 最直接的方法是使用一种称为“ducktyping”的技术来告诉您正在处理哪种对象。查看Javascript 验证响应是快速响应还是快速响应,javascript,node.js,express,fastify,Javascript,Node.js,Express,Fastify,在NodeJS中,使用Javascript我有一个“res”对象,它可以是Express或fastfy响应,有没有办法检查这两个对象中的哪一个是这个响应?有三种方法可以解决这个问题:糟糕的方法、不那么糟糕的方法和产生实际干净代码的方法 1。糟糕的方法:鸭子打字 最直接的方法是使用一种称为“ducktyping”的技术来告诉您正在处理哪种对象。查看res,检查它有哪些属性,并根据这些属性推断类型。特别是,您会对对象之间的差异感兴趣,以便能够区分它们,因此搜索其他框架没有的特殊功能 示例检查: 功能
res
,检查它有哪些属性,并根据这些属性推断类型。特别是,您会对对象之间的差异感兴趣,以便能够区分它们,因此搜索其他框架没有的特殊功能
示例检查:
功能isExpress(res){
返回(typeof res=='object'&&typeof res.sendFile=='function');
}
函数为fastfy(res){
返回(typeof res=='object'&&typeof res.hasHeader=='function');
}
但是,有一个问题:如果您得到一个res
,它是由express.js或fastfy的中间件扩展的,这会添加属性吗?然后,根据if ELSE的顺序,您可能会混淆其中一个
2。不那么可怕的方式:自己装饰对象
如果我们能够区分对象,而不管应用了什么中间件,那就更好了,这样添加的功能就不会破坏我们的类型识别逻辑
相反,我们可以使用一个特殊的、附加的属性有目的地扩展res
对象,这样无论我们处理的是express还是fastfy,从查看该属性就可以明显看出。为此,我们需要确保:
- express将用写有“我是express”的属性装饰
res
- fastify将用一个写着“我是fastify”的属性装饰
res
const FRAMEWORK_TYPE=Symbol(“res来自的框架类型”);
expressApp.use(函数(请求、恢复、下一步){
res[FRAMEWORK_TYPE]=“express”;
next();
});
fastifyApp.decorateReply(框架类型,'fastify');
然后,您可以参考res[FRAMEWORK\u TYPE]
并直接检查您留给自己的提示
3。干净的方式:设计模式
您表述原始问题的方式是:如何检查我们正在处理的实例类型。但是,此检查的目的很可能是能够将不同的框架(express和fastfy)与执行其他操作(处理程序)的单个代码段集成
这个问题通常通过以下方法解决:使用一个层,该层讲一个公共API,并且隐藏了具有不同可能实现的复杂性。例如,假设您的处理程序需要请求主体和头,并且无论框架如何,您都需要能够通过JSON进行响应。然后,您可以将处理程序签名定义为:
({body,headers})=>responseObject
接下来,从两个框架调用该处理程序。您会注意到,在express和fastfy的情况下,您需要参考req
和res
的不同部分,以便正确调用处理程序。另外,在Fastfy的情况下,您可以只执行Promise.resolve(responseObject)
,但对于express,您可能需要执行res.json(responseObject)
这样,您就可以将业务逻辑(处理程序)与基础架构层(web服务器)解耦。您知道您使用的是什么框架吗?或者您对这两个框架使用相同的处理程序?您可以检查
req.app
是否存在。这是特快专车。Fastify不填充该道具。