Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 验证响应是快速响应还是快速响应_Javascript_Node.js_Express_Fastify - Fatal编程技术网

Javascript 验证响应是快速响应还是快速响应

Javascript 验证响应是快速响应还是快速响应,javascript,node.js,express,fastify,Javascript,Node.js,Express,Fastify,在NodeJS中,使用Javascript我有一个“res”对象,它可以是Express或fastfy响应,有没有办法检查这两个对象中的哪一个是这个响应?有三种方法可以解决这个问题:糟糕的方法、不那么糟糕的方法和产生实际干净代码的方法 1。糟糕的方法:鸭子打字 最直接的方法是使用一种称为“ducktyping”的技术来告诉您正在处理哪种对象。查看res,检查它有哪些属性,并根据这些属性推断类型。特别是,您会对对象之间的差异感兴趣,以便能够区分它们,因此搜索其他框架没有的特殊功能 示例检查: 功能

在NodeJS中,使用Javascript我有一个“res”对象,它可以是Express或fastfy响应,有没有办法检查这两个对象中的哪一个是这个响应?

有三种方法可以解决这个问题:糟糕的方法、不那么糟糕的方法和产生实际干净代码的方法

1。糟糕的方法:鸭子打字

最直接的方法是使用一种称为“ducktyping”的技术来告诉您正在处理哪种对象。查看
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不填充该道具。