#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); }); });
У меня есть несколько дополнительных вопросов, но я проведу еще несколько исследований и задам их снова в новых вопросах, если не найду ясности.