在 NodeJS 中,如何等待 http2 客户端库 GET 调用的响应?
In NodeJS, how do I await the response of the http2 client library GET call?
我将 http2 客户端包与 nodeJS 一起使用。我想执行一个简单的获取请求,并等待服务器的响应。到目前为止我有
import * as http2 from "http2";
...
const clientSession = http2.connect(rootDomain);
...
const req = clientSession.request({ ':method': 'GET', ':path': path });
let data = '';
req.on('response', (responseHeaders) => {
// do something with the headers
});
req.on('data', (chunk) => {
data += chunk;
console.log("chunk:" + chunk);
});
req.on('end', () => {
console.log("data:" + data);
console.log("end!");
clientSession.destroy();
});
process.exit(0);
但我不知道的是如何在退出前等待请求的响应?现在代码飞到 process.exit 行,我看不到阻塞直到请求完成的方法。
如果你想 await
它,那么你必须将它封装到一个 returns promise 的函数中,然后你可以在那个 promise 上使用 await
。这是一种方法:
import * as http2 from "http2";
...
function getData(path) {
return new Promise((resolve, reject) => {
const clientSession = http2.connect(rootDomain);
const req = session.request({ ':method': 'GET', ':path': path });
let data = '';
req.on('response', (responseHeaders) => {
// do something with the headers
});
req.on('data', (chunk) => {
data += chunk;
console.log("chunk:" + chunk);
});
req.on('end', () => {
console.log("data:" + data);
console.log("end!");
clientSession.destroy();
resolve(data);
});
req.on('error', (err) => {
clientSession.destroy();
reject(err);
});
});
}
async function run() {
let data = await getData(path);
// do something with data here
}
run().then(() => {
process.exit(0);
}).catch(err => {
console.log(err);
process.exit(1);
});
另一种方法是使用更高级别的 http 库,它可以为您完成大部分工作。下面是使用 got
模块的示例:
import got from 'got';
async function run() {
let data = await got(url, {http2: true});
// do something with data here
}
在这种情况下,got()
模块已经为您支持 http2(如果您指定该选项),已经为您收集了整个响应并且已经支持承诺(您的代码需要添加的所有内容)你的原始版本)。
请注意,GET 方法是默认方法,因此无需在此处指定。
我将 http2 客户端包与 nodeJS 一起使用。我想执行一个简单的获取请求,并等待服务器的响应。到目前为止我有
import * as http2 from "http2";
...
const clientSession = http2.connect(rootDomain);
...
const req = clientSession.request({ ':method': 'GET', ':path': path });
let data = '';
req.on('response', (responseHeaders) => {
// do something with the headers
});
req.on('data', (chunk) => {
data += chunk;
console.log("chunk:" + chunk);
});
req.on('end', () => {
console.log("data:" + data);
console.log("end!");
clientSession.destroy();
});
process.exit(0);
但我不知道的是如何在退出前等待请求的响应?现在代码飞到 process.exit 行,我看不到阻塞直到请求完成的方法。
如果你想 await
它,那么你必须将它封装到一个 returns promise 的函数中,然后你可以在那个 promise 上使用 await
。这是一种方法:
import * as http2 from "http2";
...
function getData(path) {
return new Promise((resolve, reject) => {
const clientSession = http2.connect(rootDomain);
const req = session.request({ ':method': 'GET', ':path': path });
let data = '';
req.on('response', (responseHeaders) => {
// do something with the headers
});
req.on('data', (chunk) => {
data += chunk;
console.log("chunk:" + chunk);
});
req.on('end', () => {
console.log("data:" + data);
console.log("end!");
clientSession.destroy();
resolve(data);
});
req.on('error', (err) => {
clientSession.destroy();
reject(err);
});
});
}
async function run() {
let data = await getData(path);
// do something with data here
}
run().then(() => {
process.exit(0);
}).catch(err => {
console.log(err);
process.exit(1);
});
另一种方法是使用更高级别的 http 库,它可以为您完成大部分工作。下面是使用 got
模块的示例:
import got from 'got';
async function run() {
let data = await got(url, {http2: true});
// do something with data here
}
在这种情况下,got()
模块已经为您支持 http2(如果您指定该选项),已经为您收集了整个响应并且已经支持承诺(您的代码需要添加的所有内容)你的原始版本)。
请注意,GET 方法是默认方法,因此无需在此处指定。