是否可以使用 nginx 合并两个 json 响应?

2024-05-24

我有一个现有的快速端点,如下所示:

app.get(`${route}/:id`, async (req, res) => {
    try {
        const id = req.params.id;
        const result = await dbFn(id);
        res.send(result);
    } catch (err) {
        res.status(500).end();
    }
});

这将返回一个如下所示的对象:

{
    "id": 123,
    "name": "Foo"
}

现在,我想扩展这个 API,这样如果它有一个Accept: application/vnd.v2header,那么它还会从不同的服务获取一些数据,并将其添加到。 (请参阅我的相关问题,其中建议使用内容协商 https://softwareengineering.stackexchange.com/questions/390956/are-different-endpoints-to-display-the-same-resource-in-different-ways-restful).

IE。响应将是:

{
    "id": 123,
    "name": "Foo", 
    "extraData": {
        "foo": "bar"
    }
}

现在,我可以用 Express 来做到这一点,我是这样做的:

  app.get(`${route}/:id`, async (req, res, next) => {
    try {

      const id = req.params.id;
      const jobSeeker = await dbFn(id);
      if (req.accepts("application/vnd.v2")) {
        const response = await axios.get(`${integrationApiPath}/connection/${id}`); 
        const ssiData = response.data; 

        res.send({
          ...jobSeeker, 
          ssiData
        })

      }
      else {
        res.send(jobSeeker);
      }
    } catch (err) {
      res.status(500).end();
    }

  });

但我觉得这种 API 版本控制方式有点混乱。

如果我可以让 nginx 来处理这个版本控制,那就更好了。

这样,我不需要修改现有的 API,我只需创建新服务,让 nginx 检查标头,进行两个微服务调用并将它们连接在一起。

这可能吗?


但我觉得这种 API 版本控制方式有点混乱。

我不认为这是进行 API 版本控制的坏方法,因为这是一种常见的方法。此外,您可以在新的子目录中提供新服务(例如 yourwebsite.com/yourservice.../v2/你的函数)。

如果我可以让 nginx 来处理这个版本控制,那就更好了。

我也不同意让 NginX 做你的 web 服务的“逻辑”会更好,因为 NginX 的责任是为你的网站/web 服务提供服务,而不是实现逻辑。

但是,如果您仍然想使用 NginX 合并请求,您可能需要看看这个问题/答案 https://stackoverflow.com/questions/46267497/is-it-possible-to-consolidate-multiple-responses-and-send-one-response-in-nginx。这个答案使用开放式的 https://openresty.org/en/。你可能需要安装这个 https://openresty.org/en/installation.html first.

如上所述,您可以使用以下代码调用多个(在您的情况下为 2 个)服务:

location /yourServiceV2 {
    content_by_lua_block {
        local respA = ngx.location.capture("/yourService")
        local respB = ngx.location.capture("/theServiceWhichExtendsYourService")

        ngx.say(respA.body .. respB.body)
    }
}

如果您只想在存在特定标头时执行上述代码,您可以使用if如中所述的声明这个答案 https://stackoverflow.com/questions/18970620/nginx-reject-request-if-header-is-not-present-or-wrong。所以,你的if声明如下:

if ($http_accept == 'application/vnd.v2') {
    return 405;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以使用 nginx 合并两个 json 响应? 的相关文章

随机推荐

  • 同时运行 ng build --watch 和 ngserve 时,Angular 7 库 html 模板更改不会影响应用程序

    当 Angular 7 库 html 模板更改使用 ng build library watch 和 ngserve application 在不同的 cmd 中同时运行时 不会影响 Angular 应用程序 所以我首先使用 watch 标
  • 在 C++20 中获取当前日期/时间是线程安全的吗?

    简短的问题 在 C 17 之前 包括 C 17 C 不提供线程安全的方式来获取当前时间或日期 这个问题会在 C 20 中修复吗 长问题 获取当前时间和日期的唯一可移植方法是使用 std gmtime 或 std localtime 函数 这
  • 在非输入元素上反应 onKeyDown/onKeyUp 事件

    我需要捕获 cmd 按钮向上和向下事件 以便选择是否在 setState 中使用串联 例如 我如何在表元素上获取这些事件 您必须在主体 窗口级别捕获按键 表元素没有输入焦点 因此您无法从表中捕获键 没有输入元素 var cmdDown fa
  • Shell Crontab 不工作

    GNU nano 2 0 9 文件 tmp crontab XXXXzBQgwS 5 check phpfpm sh 5 check nginx sh 5 disk clean sh 5 loadcheck sh 按理说我的代码应该每 5
  • XNA中窗口系统的渲染策略(RenderTarget性能)

    我目前正在从头开始为 XNA 游戏创建一个窗口系统 我主要针对 Windows 进行开发 但谁知道我将来可能支持哪些平台 如果您知道本机 Direct3D 的这一点 请随意回答 因为性能语义应该类似 如果可能 请考虑如果目标平台是 X Bo
  • 使用 Print 进行简单的芹菜测试不会进入终端

    EDIT 1 实际上 print语句输出到 Celery 终端 而不是运行 python 程序的终端 正如 PatrickAllen 所示 OP 我最近开始使用Celery http www celeryproject org 但甚至无法进
  • 使用 boost 线程和非静态类函数

    所以我做了一些研究 发现你可以创建一个 boost thread 对象 并通过使用 this 和 boost bind 等以非静态类函数开头 这确实没有多大意义对我来说 我能找到的所有示例都在与其启动的函数相同的类中启动了 boost th
  • 软件开发/项目中“后端”和“前端”的定义/区别是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 新手如何区分这一点 如何知道自己正在工作的是后端系统还是前端系统 前端 通常是指项目中与用户交互的部分 例如图形用户界面或命令行 这是一个模
  • 使用 urllib2 进行 Python 身份验证

    所以我尝试使用 python 从名为 vsearch cisco com 的网站下载文件 python Connects to the Cisco Server and Downloads files at the URL specifie
  • 具有多个输入的kerasvalidation_data

    我尝试使用validation data方法 但是有问题 model fit X macd train X rsi train X ema train Y train sample weight sample weight validati
  • Magento:获取给定产品的购物车数量

    我使用这个代码 items Mage getModel checkout cart gt getQuote gt getAllItems items Mage getSingleton checkout session gt getQuot
  • 如何重写复杂的C++代码行(嵌套三元运算符)

    我一直在查看别人的代码以进行调试 发现了这一点 m seedsfilter good true m seedsfilter 1 good newClusters Sp good newSeed Sp 这是什么意思 是否有一个自动化工具可以将
  • R中两个时间之间的时间差

    我正在尝试计算 R 中两个时间之间的差异 例如 两个时间之间的时间差 03 15 和 01 40 将为 1 小时 35 分钟 我在 R 中尝试了以下代码 difftime 03 15 01 40 tz units secs 但我收到以下错误
  • 如何停止覆盖数据

    我正在尝试在我的 iOS 应用程序中保存一些数据 我使用以下代码 NSArray paths NSSearchPathForDirectoriesInDomains NSDocumentDirectory NSUserDomainMask
  • Gmail API:如何在 swift 上将附件发送到草稿

    最近 我的项目添加了使用Gmail 所以我遇到了很多关于它的问题 这让我很伤心 现在 我想知道如何将图像发送到草稿 我的代码如下 func postEmailMessageRequest model MEMailMessageModel r
  • 仅对小型设备使用偏移的中心引导列

    我正在尝试在图像旁边显示文本 我希望它仅在设备宽度低于 767px 时才堆叠 否则 我希望他们肩并肩 在此堆叠过程中 图像具有响应性 因此它占据了文本上方的整行 为了避免这种情况 我尝试在列为xs时限制列的大小 这可确保图像在指定的列大小内
  • 如何在 ios 应用程序中将 .svg url 显示为图像

    我从服务器获取 svg 网址 如何在我的应用程序中将其显示为图像 我尝试在 UIWebView 中显示它 但无法调整内容图像的大小 我正在使用这个代码 let request NSURLRequest NSURLRequest url UR
  • Postgres 多重连接

    这是一个 postgres 数据库 我试图从品种表中提取狗的品种名称 卡斯罗 拉布拉多等 以根据动物表中的外键进行显示 我的问题是动物表有两个外键指向这个单一品种表 并且我的查询不断出错 第一个品种名称将根据左连接返回 但第二个品种名称无法
  • PolyML 函数和类型

    一对函数tofun int gt a gt a and fromfun a gt a gt int这样 fromfun o tofun n评估为n对于每一个n int 任何人都可以向我解释这实际上要求什么 我正在寻找更多对此的解释 而不是实
  • 是否可以使用 nginx 合并两个 json 响应?

    我有一个现有的快速端点 如下所示 app get route id async req res gt try const id req params id const result await dbFn id res send result