繁体   English   中英

验证响应是 express 还是 fastify

[英]Verify if response is express or fastify

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

有 3 种方法可以解决这个问题:不好的方法,不太糟糕的方法,以及产生实际干净代码的方法。

1. 坏方法:鸭式打字

最直观的方法是使用一种称为“鸭子打字”的技术来判断您正在处理的是哪种 object。 查看res ,检查它具有哪些属性,并据此推断类型。 特别是,您将对对象之间的差异感兴趣以便能够将它们区分开来,因此请搜索其他框架没有的特殊功能。

示例检查:

function isExpress(res) {
  return (typeof res === 'object' && typeof res.sendFile === 'function');
}
function isFastify(res) {
  return (typeof res === 'object' && typeof res.hasHeader === 'function');
}

但是,有一个问题:如果你得到一个由 express.js 或 fastify 的中间件扩展的res ,它添加了属性怎么办? 然后,根据您的 if-else 的顺序,您可能会混淆另一个。

2. 不那么糟糕的方法:自己装饰 object

如果无论应用什么中间件,我们都能区分对象会更好——这样添加的特性就不会破坏我们的类型识别逻辑。

相反,我们可以有目的地使用特殊的附加属性扩展res object,这样无论我们是在处理 express 还是 fastify,通过查看该属性就很明显了。 为此,我们需要确保:

  • express 将用“I'm express”的属性装饰res
  • fastify 会用一个“我是 fastify”的属性来装饰res

毫不夸张的说:

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');

然后,您可以参考res[FRAMEWORK_TYPE]并直接检查您为自己留下的提示。

3. 干净的方式:设计模式

您制定原始问题的方式是:如何检查我们正在处理的实例类型。 但是,此检查的目的很可能是能够将不同的框架(express 和 fastify)与执行其他操作的单个代码(处理程序)集成。

这个问题通常通过适配器设计模式来解决 - 有一个层使用常见的 API 并隐藏具有不同可能实现的复杂性。 例如,假设您的处理程序需要请求正文和标头,并且无论框架如何,您都需要能够通过 JSON 进行响应。 然后,您可以将处理程序签名定义为:

({ body, headers }) => responseObject

接下来,从两个框架中调用该处理程序。 您会注意到,在 express 和 fastify 的情况下,您需要引用reqres的不同部分才能正确调用处理程序。 此外,在 fastify 的情况下,您可以只Promise.resolve(responseObject) ,但对于 express,您可能需要改为res.json(responseObject)

这样,您就可以将业务逻辑(处理程序)与基础设施层(Web 服务器)分离。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM