我有三个组件
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 请求?
您正在使用
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;
}
可以使用 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;
}
希望这有帮助:)。