Могу ли я получить полный текст http-ответа в nodejs из http-модуля .получить ответ?

#javascript #node.js #http #webserver

Вопрос:

У меня есть очень простой веб-сервер:

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

Сервер работает. Когда я открываю браузер на локальном хосте:1234, я получаю текст Hello World. Когда я отправляю сообщение GET на localhost:1234 от клиента REST, я получаю:

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

Теперь я хотел бы написать тест, но у меня возникли проблемы с поиском способа извлечь текст «Привет, мир» из ответа. На данный момент мой тестовый код выглядит следующим образом:

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

Это всегда возвращает значение null.

Я тоже пытался:

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

Это возвращает пустой массив.

Когда я отлаживаю и смотрю на объект res, в ответе легко найти все (в основном в заголовках res.), кроме текста Hello World. Я видел множество примеров извлечения данных, отправленных в формате JSON и т. Д., Но я хочу начать с самого простого возможного примера (простой текст) и, похоже, не могу найти никакого способа сделать это. Похоже, что все, что может вернуть браузер, должно быть доступно, когда я отправляю GET через HTTP-модуль, но я не могу его найти.

Ответ №1:

вы можете прочитать ответ как json, сделав это следующим образом :

Файл сервера :

 const ws = require('http');  ws.createServer(  (request, response) =gt; {   console.log('request received');   response.write('{"body": "Hello World !"}');  response.end();   } ).listen(1234);  

Файл запроса :

 const http = require('http');  http.get('http://localhost:1234', (response) =gt; {   response.on("data", (chunk) =gt; {   body = JSON.parse(chunk).body   console.log(body); // return 'Hello World !' as text  })  }).on('error', function(e) {  console.log("Error message : "   e.message); });  

Комментарии:

1. Спасибо — я видел много примеров в Интернете, делающих что-то подобное, но я не могу предположить, что любые запросы всегда будут возвращать JSON. Мне бы очень хотелось увидеть полный ответ (а не только ту часть, которая отформатирована как JSON) и в идеале ничего не менять на сервере (потому что сервер действительно дает ожидаемый ответ, когда я получаю, например, от клиента REST).

Ответ №2:

Мне удалось это выяснить. Ну, вроде того. Я нашел кое-что, что работает, но все еще не до конца понимаю его механику.

Следующие работы и журналы

Привет, мир

к пульту.

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

Похоже, вам нужно прослушать событие для чтения, чтобы получить что-либо из read (), и когда вы это сделаете, вы вернете текст Hello world (хотя в виде буферного массива, поэтому необходима функция toString ()).

Аналогично, следующее также работает для события «данные»:

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

У меня есть несколько дополнительных вопросов, но я проведу еще несколько исследований и задам их снова в новых вопросах, если не найду ясности.