NodeJS 请求多个 api 端点

2024-01-13

好的,我正在尝试使用请求模块向 API 端点发出两个或多个请求。我正在渲染一个 HTML 文件,并使用以下代码将返回的 JSON 传递到车把模板:

res.render('list.html', {
  title: 'List',
  data: returnedJSON
}

然后,我可以相当轻松地在车把模板中迭代此 JSON。

我遇到的问题是,我现在需要使用多个数据源,其中将根据类别 JSON 响应构建类别列表,并根据员工 JSON 响应构建员工列表。我想要一个简单的解决方案,可以做到这一点,但可以扩展它以使用任意数量的数据源。

下面是我使用一个数据源所拥有的完整代码片段:

request({
    url: 'https://api.com/categories',
    headers: {
        'Bearer': 'sampleapitoken'
    }
}, function(error, response, body) {
    if(error || response.statusCode !== 200) {
        // handle error
    } else {
        var json = JSON.parse(body);
        res.render('list.html', {
            title: 'Listing',
            data: json
        });
    }
});

这对于一个端点非常有用,但正如之前提到的,我现在需要使用多个请求并拥有多个数据源,例如:

request({
    url: ['https://api.com/categories','https://api.com/staff'],
    headers: {
        'Bearer': 'sampleapitoken'
    }
}, function(error, response, body1, body2) {
    if(error || response.statusCode !== 200) {
        // handle error
    } else {
        var json1 = JSON.parse(body1);
        var json2 = JSON.parse(body2);
        res.render('list.html', {
            title: 'Listing',
            staff: json1,
            categories: json2
        });
    }
});

我很欣赏上述内容并非如此,但我希望这可以帮助传达我想要实现的目标。

提前致谢 :)


您可以使用async https://github.com/caolan/async库来映射您的请求对象并将它们传递给实际请求并在一个回调中返回所有结果。

var async = require("async");
var request = require("request");

// create request objects
var requests = [{
  url: 'https://api.com/categories',
  headers: {
    'Bearer': 'sampleapitoken'
  }
}, {
  url: 'https://api.com/staff',
  headers: {
    'Bearer': 'sampleapitoken'
  }
}];

async.map(requests, function(obj, callback) {
  // iterator function
  request(obj, function(error, response, body) {
    if (!error && response.statusCode == 200) {
      // transform data here or pass it on
      var body = JSON.parse(body);
      callback(null, body);
    } else {
      callback(error || response.statusCode);
    }
  });
}, function(err, results) {
  // all requests have been made
  if (err) {
    // handle your error
  } else {
    console.log(results);
    for (var i = 0; i < results.length; i++) {
      // request body is results[i]
    }
  }
});

然而,更简单的方法是利用承诺,这可以通过 bluebird 并承诺请求库来完成,或者使用已经承诺的请求库请求-承诺 https://github.com/request/request-promise。您仍然需要包含一个 Promise/A+ 库来异步映射结果。

var Promise = require("bluebird");
var request = require('request-promise');

// create request objects
var requests = [{
  url: 'https://api.com/categories',
  headers: {
    'Bearer': 'sampleapitoken'
  }
}, {
  url: 'https://api.com/staff',
  headers: {
    'Bearer': 'sampleapitoken'
  }
}];

Promise.map(requests, function(obj) {
  return request(obj).then(function(body) {
    return JSON.parse(body);
  });
}).then(function(results) {
  console.log(results);
  for (var i = 0; i < results.length; i++) {
    // access the result's body via results[i]
  }
}, function(err) {
  // handle all your errors here
});

值得注意的是,所有最新版本的节点和浏览器都支持开箱即用的 Promise,并且无需外部库即可实现。

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

NodeJS 请求多个 api 端点 的相关文章

  • Node js 使用中间件重定向进行过多重定向

    在我的 Node js 应用程序 我使用的是express 4 x 中 我想检查用户是否已登录 如果用户未登录 我想重定向到我的登录页面 然后我在中间件中这样做 服务器 js app use function req res next if
  • Jquery从下拉列表中获取所选值的id

    我有一个下拉列表 可以从数据库获取值 如下所示 get getJobs function jobs seljobs jobs var i 0 jobs forEach function n alert job id n id 32 67 4
  • 动画进度元素值

    我有一个progress元素 该元素如下所示 div class container div div div
  • Leaflet js虚构地图

    我是 Leaflet 的新手 我想了解如何创建完全交互式的虚构地图 我有一张图像想要转换为传单地图 该图像基本上像图表一样具有许多连接和点 我想首先将该图像转换为地图 能够将鼠标悬停在这些点上 突出显示它们并显示有关它们的信息 并且还可以在
  • 使用 CryptoJS 更改密钥 [重复]

    这个问题在这里已经有答案了 我正在使用 CryptoJS 来加密和解密文本 在这里 我只是获取消息并显示加密和解密消息 我使用DES算法进行加密和解密 这是我的 HTML 文件
  • jquery window.open 在 ajax 成功中被阻止

    尝试在我的 ajax 成功调用中打开一个新的浏览器窗口 但是 它被阻止为弹出窗口 我做了一些搜索 发现用户事件需要绑定到 window open 才能避免这种情况发生 我还找到了这个解决方案 您可以在 ajax 之前打开一个空白窗口 然后在
  • 是否可以使用 javascript 测试用户的浏览器/操作系统是否支持给定类型的链接?

    是否可以使用 javascript 或其他任何东西 测试用户的操作系统 浏览器是否支持给定的 url 方案 例如 大多数仅使用网络邮件的用户计算机上未设置 mailto 是否有可能以某种方式捕获单击 mailto 链接的尝试并弹出比浏览器错
  • 如何使用 JavaScript 获取没有 HTML 元素的纯文本?

    我的 HTML 中有 1 按钮和一些文本 如下所示 function get content I don t know how to do in here
  • 使用 json_encode() 函数在 PHP 数组中生成 JSON 键值对

    我正在尝试以特定语法获取 JSON 输出 这是我的代码 ss array 1 jpg 2 jpg dates array eu gt 59 99 us gt 39 99 array1 array name gt game1 publishe
  • Javascript - 将值从下拉框传递到 Google Maps API

    我正在使用 Google 地图 API 为一家出租车公司创建报价表 目前 用户在 2 个文本框中输入出发点和接载点 API 会计算两点之间的距离以及行程费用 我正在尝试添加两个具有设定位置的下拉框 以便用户可以选择这些位置之一或使用文本框输
  • 未捕获的错误:找不到模块“jquery”

    我在用Electron https github com atom electron制作桌面应用程序 在我的应用程序中 我正在加载一个外部站点 Atom 应用程序之外 可以说http mydummysite index html http
  • 是否有任何非轮询方式来检测 DOM 元素的大小或位置何时发生变化?

    很长一段时间以来 我一直在寻找一种方法来检测 DOM 元素的大小或位置何时发生变化 这可能是因为窗口调整了大小 或者因为向该元素添加了新的子元素 或者因为在该元素周围添加了新元素 或者因为 CSS 规则已更改 或者因为用户更改了浏览器的字体
  • JS用正则表达式替换数字

    我有元素的标识符 如下所示 form book 1 2 3 我想要的是用其他值替换该标识符中的第二个数字 我将函数 match 与以下正则表达式一起使用 var regexp d d d 但它返回我包含的数组 1 2 3 2 因此 当我尝试
  • 单击关闭按钮后不显示 Google 一键登录 UI

    我正在尝试按照本指南使新的谷歌一键登录工作 https developers google com identity one tap web https developers google com identity one tap web
  • JavaScript onresize 事件多次触发

    我在尝试仅在触发 onresize 事件时运行一次函数时遇到一些麻烦 我已经看过这个问题DOM onresize 事件 https stackoverflow com questions 1500312 javascript onresiz
  • 如何获取 UIWebView 中元素的位置?

    我在 iPad 程序中加载了 html 的 UIWebView 通过使用 webkit column width 我将 html 分为几列 padding 0px height 1024px webkit column gap 0px we
  • 数据表日期范围过滤器

    如何添加日期范围过滤器 like From To 我开始进行常规搜索和分页等工作 但我不知道如何制作日期范围过滤器 我正在使用数据表 1 10 11 版本 My code var oTable function callFilesTable
  • 如何在 Google 地图 V3 中创建编号地图标记?

    我正在制作一张上面有多个标记的地图 这些标记使用自定义图标 但我还想在顶部添加数字 我已经了解了如何使用旧版本的 API 来实现这一点 我怎样才能在V3中做到这一点 注意 当您将鼠标悬停在标记上时 标题 属性会创建一个工具提示 但我希望即使
  • 单击引导分页链接时调用 jquery 函数

    我想在单击引导分页链接时调用 jquery 函数 假设我想从第1页遍历到第2页 应该调用一个jquery函数 我正在使用以下代码 但它不起作用 ul pagination on click li function alert page ch
  • 需要有关 React Js 的帮助

    我是 React Js 新手 我的代码无法正常工作 请看下面 这是我的脚本文件Main jsx 该文件由 React 编译 输出放置在 dist 文件夹下的 main js 文件中 var react require react react

随机推荐

  • 尝试使用 LibGDX 登录 GooglePlay 游戏服务时出现“signInSilently():失败”

    我一直在尝试添加Google Game Services过去三天我一直在关注我的 LibGDX 项目 现在我首先尝试了 LibGDX 教程 但所有这些教程似乎都已经过时了 然后建议我使用Google Game Services官方代码 Li
  • 使用 nasm 在 64 位和 32 位架构上从汇编语言调用 printf

    我想在linux中从汇编语言调用printf函数 我想知道64位和32位汇编语言程序的方法 1 如果我想用字符串在 printf 中传递 32 位参数和 64 位参数 请告诉我两种情况 我该怎么做 2 对于 x86 32 位架构 如果我想做
  • pgAdmin 中的主键和外键

    我想知道有人能给我解释一下如何在 pgAdmin 中分配主键和外键吗 我在网上找不到任何信息 例如 我有一个学生表 其中包含他们的所有详细信息 地址 出生日期等 我将向表中添加一个 Student number 并使其成为主键 我只是想知道
  • 反射问题——类型安全警告

    Class getConstructors http java sun com javase 6 docs api java lang Class html get
  • 通过属性值对 XML 进行排序 PHP

    所以我有一个 XML 文件 我试图根据属性 order 按顺序循环遍历该文件 这是一个例子
  • JUnit 3 是否有类似于 @Ignore 的东西

    我被迫使用 JUnit 3 如果我使用 JUnit 4 我偶尔会使用 Ignore因为我的一些测试需要一些时间 JUnit 4 中有类似的东西吗 注释掉测试很草率 并且更改了名称 来自testXxx 可能会导致忘记测试 Ignore很棒 因
  • 富文本框如何突出显示文本块

    我需要在 RTB 中突出显示文本的特定部分 不是指更改字体样式 颜色 而是指使用特定颜色进行块选择 这类似于 Visual Studio 在调试模式下突出显示一行的方式 我如何使用 RTB 来实现此功能 或者更确切地说 这是否可能 如果不可
  • 为不同节点类型配置jstree右键上下文菜单

    我在网上看到了一个示例 展示了如何自定义 jstree 右键单击 上下文菜单的外观 使用 contextmenu 插件 例如 允许我的用户删除 文档 但不能删除 文件夹 通过从文件夹的上下文菜单中隐藏 删除 选项 现在我找不到那个例子了 有
  • R 中的 pheatmap 格式:图例大小并创建方形图

    Pheatmap 仅在 legend FALSE 时创建方形图 我尝试使用 par 来允许更多 oma 和 mar 空间 但运气不佳 图例也很大 我找不到任何有关减少此图例或更改其位置的文档 第一个图没有安装树状图 但这与尺寸问题无关 无论
  • 使用股票代码输入、yahoo 或 google API 检索公司名称

    只是寻找一个简单的 api 返回 我可以在其中输入股票代码并接收完整的公司名称 股票代码 MSFT 将返回 微软 import yfinance as yf msft yf Ticker MSFT company name msft inf
  • 如何将 NSPanel 显示为工作表

    我正在尝试将 NSPanel 显示为工作表 我天真地沿着这些路线做一些事情 SheetController sheetController SheetController alloc initWithWindowNibName Sheet
  • maven buildnumber插件错误The scm url can not be null

    我是 Maven 的新用户 并且很难让 buildnumber maven plugin 执行我所期望的操作 本质上 我希望 maven 构建我的项目并创建结果的 JAR 文件 并在 manifest mf 文件中设置构建号 我将在下面包含
  • 如何抑制此 COM 泛型警告?

    我正在使用 msbuild 编译 VB Net 2 0 应用程序 在 VS2008 中创建 现在我添加了一个通用返回类型 它给了我以下内容 警告 类型库导出器 遇到泛型类型实例 一个签名 通用代码可能不是 导出到COM 刚刚花了很长时间删除
  • 使用 GUI 和工作线程增强 Asio 模式

    我想使用 GUI 线程和某些套接字 IO 的工作线程来实现 Boost Asio 模式 工作线程将使用boost asio io service管理套接字客户端 套接字上的所有操作将仅由工作线程执行 GUI 线程需要从工作线程发送和接收消息
  • 融合几个接近点的简单方法?

    我有一个这样的点列表 points 57 213878612138828 17 916958304169601 76 392039480378514 0 060882542482108504 0 12417670682730897 1 04
  • Hibernate @LazyCollection 注解有什么用

    我有 2 个实体作为父实体和子实体作为 OneToMany 关系 Entity public class Parent Id GeneratedValue strategy GenerationType AUTO private Integ
  • java 如何知道您是否正在运行 javaw.exe 与 java.exe

    相关以编程方式从 java 代码中查找 java exe 的绝对路径 https stackoverflow com questions 9006127 find absolute java exe path programatically
  • 如何使用 C 捕获另一个进程的输出?

    如何使用纯 C 捕获另一个进程的输出 你能提供示例代码吗 编辑 让我们假设Linux 我会对 相当可移植 的代码感兴趣 我想做的就是执行一个命令 捕获它的输出并以某种方式处理它 有多种选择 但它在一定程度上取决于您的平台 那就是说popen
  • 使用 NPOI,如何返回已由 Excel 格式化的单元格值?

    Using NPOI https npoi codeplex com 是否有任何内置的可能性来格式化单元格值 特别是数字和日期值 因为它已经 如果不是 最好的实施方式是什么 我想到了从 Excel 格式字符串到 C 格式字符串的格式字符串转
  • NodeJS 请求多个 api 端点

    好的 我正在尝试使用请求模块向 API 端点发出两个或多个请求 我正在渲染一个 HTML 文件 并使用以下代码将返回的 JSON 传递到车把模板 res render list html title List data returnedJS