在 NodeJS 中,如何将 HTTP 请求包装到 Promise 中?

2024-03-21

NodeJS 6.9.3

我编写了一个简单的 NodeJS 应用程序,它发出如下所示的请求:

var http_request = require('request')


        http_request(
            { method: 'GET'
              , uri: 'https://search-xxxxxx.us-east-1.es.amazonaws.com/facts/_search?pretty=true'
              ,   'content-type': 'application/json'
              ,  body: es_regexp_query_as_string
            }
            , function (error, response, body) {
                if(
                    response.statusCode == 201
                        ||
                        response.statusCode == 200) {

而且效果很好。我在回调中做了我需要做的任何事情。但是,现在我需要重新构建这个应用程序,以便它可以执行任意数量的请求,而不是执行一个 HTTP 请求。据我了解,在 NodeJS 中处理此问题的理想“设计模式”是将每个请求包装在 Promise 中,然后将所有 Promise 交给以下调用:

Promise.all(something)

但我一直在阅读这篇文章,但我不知道如何将 HTTP 请求转换为 Promises。或者更确切地说,存在大量相互矛盾的建议。显然,就在过去一两年,NodeJS 中“Promise”的概念发生了很大变化。

我尝试简单地将整个代码块包装在 Promise 中,但这不起作用。那我该怎么办?


如果您想要一个没有任何外部模块的解决方案,请检查以下代码:

// Dependencies
var http = require('http');
var https = require('https');

var httpRequest = function(options){
  if(!options)      return new Promise((_, reject)=>{ reject( new Error('Missing \'options\' arg.'))})
  if(!options.host) return new Promise((_, reject)=>{ reject( new Error('\'host\' parameter is empty.'))})

  var protocol = (options.protocol || 'http').toLowerCase();
  var method   = (options.method || 'GET').toUpperCase();
  var path     = options.path || '/';
  var port     = options.port || (protocol == 'https' ? 443 : 80);


  var _http = protocol == 'https'? https : http;

  var prom = new Promise((resolve, reject)=>{
    var ops = {
      host : options.host, // here only the domain name
      port : port,
      path : (/^(\/)/i.test(path) ? '' : '/' ) + path,
      headers: options.headers || {}, 
      method : method
    };
    var body = options.body;
    if(body && typeof(body) === 'object'){
      body = JSON.stringify(body);      
      if(!utils.hasHeader(ops, 'Content-Type')) ops.headers['Content-Type'] = 'application/json; charset=utf-8';
      if(!utils.hasHeader(ops, 'Content-Length')) ops.headers['Content-Length'] = Buffer.byteLength(body, 'utf8');
    }


    var req = _http.request(ops, (res)=>{
      var decoder = new StringDecoder('utf-8');
      var buffer = '';
      res.on('data', function(data) {
          buffer += decoder.write(data);
      });
      res.on('end', function() {
        buffer += decoder.end();


      if(/^(2)/i.test(res.statusCode.toString()))
          resolve({statusCode : res.statusCode , data : buffer })
        else
          reject({statusCode : res.statusCode , error : buffer })
    });
    req.on('error', (err)=>{
      reject({statusCode : 0, error : err});
    })

    req.on('timeout', (err)=>{
      reject({statusCode : 0, error : new Error('Timeout exeded.')});
    })

    if(body) req.write(Buffer.from(body).toString('utf8'));
    req.end();
  });

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

在 NodeJS 中,如何将 HTTP 请求包装到 Promise 中? 的相关文章

随机推荐

  • 在闪亮的仪表板标题右侧添加文本

    如何在仪表板标题侧栏图标右侧添加文本 似乎以前的类似解决方案在更新后不再起作用dashboardHeader 这就是我试图在基本的闪亮仪表板设置中执行的操作 我可以使用以下策略这个答案 https stackoverflow com a 3
  • 使用 python 和 python NTLM 浏览受 NTLM 保护的网站

    我的任务是创建一个脚本 该脚本登录到企业门户 进入特定页面 下载该页面 将其与早期版本进行比较 然后根据所做的更改向特定人员发送电子邮件 最后一部分很简单 但第一步给我带来了最大的麻烦 在使用 urllib2 我尝试在 python 中执行
  • 在Python中将字符串从split函数转换为整数的有效方法

    我有一串具有以下格式的数据 xpos ypos zoom 即 8743 12083 15 我想将其拆分并存储在变量 xpos ypos 和 Zoom 中 由于我需要对这些数字进行一些计算 因此我想从一开始就将它们转换为整数 目前 我执行此操
  • 使用 css3 进行图像替换和过渡?

    我想知道是否有人知道如何在两个背景图像之间进行过渡的巧妙且新的方法 我知道有很多教程 只是其中大多数都已经过时且过时了 我想知道是否有一种聪明而现代的 CSS3 方法可以做这样的事情 我有一个简单的 logo png 设置为背景div lo
  • 无法将泛型转换为扩展嵌套类型

    最近 当我遇到无法解释的通用转换问题时 我正在重构一个通用方法 最后我意识到我可以完全不用 T 类型 只需自己内联它 但我仍然很好奇为什么转换失败 我创建了这个最小的例子来说明这个问题 有人可以解释一下为什么转换失败而解决方法有效吗 pub
  • 无法实例化fragment找不到Fragment构造函数android

    我遇到以下错误 我在 DailyVerseFragment 上添加了构造函数 但还是不行 我遇到这个问题已经超过一周了 Fatal Exception java lang RuntimeException Unable to start a
  • 如何从终端运行 mvim (MacVim)?

    我安装了 MacVim 并尝试将其设置为 Git 版本控制 的编辑器 但我无法从命令行运行 mvim 因为它无法识别 如何设置 mvim 以便可以从终端运行它 我不认为我会在路径中添加任何东西 是的 brew install macvim
  • 如何编写按日期接收数据的查询?

    我写了一个简单的查询 SELECT date count user as count FROM sessions GROUP BY date 回应是这样的 但是 我想查看每个日期 如果日期不存在 行必须是这样的 2018 02 01 0 2
  • 使用 Cordova 3.1 CLI 构建 Android 应用程序时出错

    我正在尝试通过 Mac 上的终端通过phonegap CLI 运行 cordova build android 首先我下载了 Android SDK 然后我设置了项目并添加了android 然后我尝试 cordova build andro
  • 增长 NSTextView 以适应内容会剪切最后一行文本

    我正在尝试创建一个 NSTextView 它随着用户键入而垂直增长 并在高度达到最大值后滚动 这类似于消息作品中的文本视图 我的第一次尝试使用委托来侦听文本更改并调整与 NSTextView 的滚动视图关联的高度约束 void textDi
  • 在 codeigniter 中卷曲

    我想在我的 codeigniter 应用程序中使用curl 但我得到的是空数组 我的代码是这样的 this gt load gt library curl url http url checkweb php post data array
  • JWT 和签名 cookie 有什么区别?

    我正在调查JWT http jwt io作为传统 Cookie 会话的替代方案 但我看不出它们与签名 Cookie 有何根本区别 例如 Express 通过中间件提供的签名 Cookiecookie解析器 https www npmjs c
  • 如何在 Olingo V4 中创建有界动作 (java)

    我尝试到处寻找 但无法弄清楚如何在 olingo V4 java 中实现有界操作 处处给出无界动作教程 我尝试调整这段代码 final CsdlAction action new CsdlAction action setName test
  • 收到“Stream 不支持写入。”以下代码中出现异常

    我正在尝试将图像上传到 Amazon S3 但在此之前我正在调整图像大小 为了调整大小 我必须传递流对象 并且在某一时刻 注释为 Error 的行 我收到 Stream 不支持写入 例外 请帮忙 public ActionResult Ad
  • Vim 中可以有特定于文件类型的键绑定吗?

    In my vimrc文件中 我有一个用于注释的键绑定 用于插入双斜杠 在一行的开头 the mappings below are for commenting blocks of text map
  • 扩展 AbstractAnnotationConfigDispatcherServletInitializer 时的 getServletConfigClasses() 与 getRootConfigClasses()

    有什么区别getServletConfigClasses vs getRootConfigClasses 延伸时AbstractAnnotationConfigDispatcherServletInitializer 从今天早上开始我已经阅
  • 管理中自定义 Magento 配置出现 404 错误

    我正在 Magento 1 6 中开发自定义 SMS 模块 我已经设置了system xml文件来管理相关的自定义配置字段 菜单条目显示出来 但当我单击它时 会显示 404 错误页面 而不是预期的配置字段列表 你能看到我的代码中有任何错误吗
  • 如何在 iPhone 应用程序中实现密码恢复?

    我想在我正在开发的 iPhone 应用程序中添加简单的密码保护 我可能会使用 crypt 将密码存储在我的数据库中 该数据库采用 CoreData sqlite 格式 我认为我对如何创建和存储密码有很好的了解 但如果用户忘记密码 我想添加密
  • do-while 循环的目的是什么? [复制]

    这个问题在这里已经有答案了 我知道 do 的作用 以及它如何与 while 循环配合 但是无论 do 是否存在 while 循环代码不会相同吗 考虑以下 while condition myFunction and do myFunctio
  • 在 NodeJS 中,如何将 HTTP 请求包装到 Promise 中?

    NodeJS 6 9 3 我编写了一个简单的 NodeJS 应用程序 它发出如下所示的请求 var http request require request http request method GET uri https search