Node.js 中的同步 HTTP 请求

问题描述 投票:0回答:2

我有三个组件

A
B
C
。 当
A
B
发送 HTTP 请求时,
B
C
发送另一个 HTTP 请求,检索相关内容并将其作为 HTTP 响应发送回
A

B
组件由以下 Node.js 片段表示。

var requestify = require('requestify');

// sends an HTTP request to C and retrieves the response content
function remoterequest(url, data) {
  var returnedvalue;
  requestify.post(url, data).then(function(response) {
    var body = response.getBody();
    // TODO use body to send back to the client the number of expected outputs, by setting the returnedvalue variable
  });
  return returnedvalue;
}

// manages A's request
function manageanotherhttprequest() {
  // [...]
  var res = remoterequest(url, data);
  // possible elaboration of res
  return res;
}

我需要返回

body
内容作为
remoterequest
函数的结果。 我注意到,目前 POST 请求是异步的。因此,在将
returnedvalue
变量返回给调用方法之前,永远不会对其进行赋值。

如何执行同步 HTTP 请求?

node.js web-services http asynchronous requestify
2个回答
3
投票

您正在使用

restify
,一旦调用其方法(
promise
post
..等),它将返回
get
。但是您创建的方法
remoterequest
不会返回
promise
让您等待使用
.then
。您可以使用
promise
或内置
async-await
使其返回
promise
,如下所示:

  • 使用承诺:

    var requestify = require('requestify');
    
    // sends an HTTP request to C and retrieves the response content
    function remoterequest(url, data) {
      var returnedvalue;
      return new Promise((resolve) => {
        requestify.post(url, data).then(function (response) {
          var body = response.getBody();
          // TODO use body to send back to the client the number of expected outputs, by setting the returnedvalue variable
        });
        // return at the end of processing
        resolve(returnedvalue);
      }).catch(err => {
        console.log(err);
      });
    }
    
    // manages A's request
    function manageanotherhttprequest() {
      remoterequest(url, data).then(res => {
        return res;
      });
    }
    
  • 使用异步等待

    var requestify = require('requestify');
    
    // sends an HTTP request to C and retrieves the response content
    async function remoterequest(url, data) {
    
      try {
        var returnedvalue;
        var response = await requestify.post(url, data);
        var body = response.getBody();
        // TODO use body to send back to the client the number of expected outputs, by setting the returnedvalue variable
        // return at the end of processing
        return returnedvalue;
      } catch (err) {
        console.log(err);
      };
    }
    
    // manages A's request
    async function manageanotherhttprequest() {
        var res = await remoterequest(url, data);
        return res;
    }
    

0
投票

可以使用 sync-request-curl 发送同步 HTTP 请求 - 我在 2023 年编写的一个库。

它包含原始 sync-request 中功能的子集,但利用 node-libcurl 在 NodeJS 中获得更好的性能。

一个简单的HTTP GET请求可以写成如下:

// import request from 'sync-request-curl'; // for ESM
const request = require('sync-request-curl');
const response = request('GET', 'https://ipinfo.io/json');
console.log('Status Code:', response.statusCode);
console.log('body:', response.body.toString());

对于您的情况,您的函数可以以同步方式重写,如下所示:

const request = require('sync-request-curl');

// sends an HTTP request to C and retrieves the response content
function remoterequest(url, data) {
  const response = request('POST', url, { json: data });

  if (response.statusCode === 200) {
    return JSON.parse(response.body.toString());
  } else {
    // handle error
  }
}

// manages A's request
function manageanotherhttprequest() {
  // [...]
  const res = remoterequest(url, data);
  // possible elaboration of res
  return res;
}

希望这有帮助:)。

© www.soinside.com 2019 - 2024. All rights reserved.