在 NodeJS 中,如何等待 http2 客户端库 GET 调用的响应?

问题描述

我在 nodeJS 中使用 http2 客户端包。我想执行一个简单的获取请求,并等待来自服务器的响应。到目前为止,我有

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它,那么你必须把它封装成一个返回一个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 方法是默认方法,因此无需在此处指定。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...