我可以从 http 模块 .get 响应中获取 nodejs 中的完整 http 响应文本吗?

Can I get the full http response text in nodejs from a http module .get response?

我有一个非常简单的网络服务器:

const ws = require('http');

ws.createServer(
    function(req,res)
    {
        console.log('request received');
        res.write('Hello world');
        res.end();
    })
    .listen(1234);

服务器正常。当我在 localhost:1234 上打开浏览器时,我收到 Hello World 文本。当我从 REST 客户端向 localhost:1234 发送 GET 时,我得到:

HTTP/1.1 200 OK
Date: Fri, 03 Dec 2021 20:10:12 GMT
Connection: close
Transfer-Encoding: chunked

Hello world

现在,我想编写一个测试,但我找不到从响应中提取“Hello world”文本的方法。目前,我的测试代码如下所示:

const http = require('http');

let req = http.get('http://localhost:1234',(res)=>{
    let txt = res.read();
    console.log(txt);
});

这总是 return 为空。

我也试过:

const http = require('http');

let req = http.get('http://localhost:1234',(res)=>{
    let data = [];
    res.on('data',(chunk)=>data.push(chunk));
    console.log(data);
});

这 return 是一个空数组。

当我调试并查看 res 对象时,很容易在响应中找到除 Hello World 文本之外的所有内容(主要在 res.headers 中)。我见过很多提取以 JSON 格式等格式发送的数据的示例,但我想从最简单的示例(纯文本)开始,但似乎找不到任何方法来执行此操作。当我通过 HTTP 模块发送 GET 时,浏览器似乎可以 return 应该 可用,但我找不到它。

您可以通过这种方式将响应读取为 json:

服务器文件:

const ws = require('http');

ws.createServer(
  (request, response) => {

    console.log('request received');

    response.write('{"body": "Hello World !"}');
    response.end();

  }
).listen(1234);

请求文件:

const http = require('http');

http.get('http://localhost:1234', (response) => {

  response.on("data", (chunk) => {

    body = JSON.parse(chunk).body

    console.log(body); // return 'Hello World !' as text
  })

}).on('error', function(e) {
  console.log("Error message : " + e.message);
});

我设法弄明白了。好吧。我找到了一些有用的东西,但仍然不完全理解它的机制。

以下作品及日志

Hello world

到控制台。

const http = require('http');
let req = http.get('http://localhost:1234',async (res)=>{
    res.on('readable', () => {
        let txt=res.read().toString();
        console.log(txt);
    });
});

似乎您需要侦听可读事件才能从 read() 中获取任何内容,并且当您这样做时确实会带回 Hello world 文本(尽管作为 Buffer 数组,因此需要 ToString() ).

同样,以下也适用于 'data' 事件:

const http = require('http');

let req = http.get('http://localhost:1234',(res)=>{
    let txt = '';
    res.on('data',(chunk)=>{
        txt+=chunk.toString();
        console.log(txt);
    });
});

我有一些后续问题,但我会做更多的研究,如果我觉得不清楚,我会在新问题中再次提问。