Узел http.request () : связь с var ClientRequest и callbackFn

#javascript #node.js

#javascript #node.js

Вопрос:

Я новичок в Node.js .

И я пытаюсь продолжить изучение Node.js API .

Я сослался и написал поисковый робот, и код работает.

Я успешно разместил комментарий на веб-сайте.

Но меня смущает порядок выполнения с возвратом class — ClientRequest и

Обратный вызов .

 var req = http.request(urlRequest,function(res){
console.log("Status: " res.statusCode);
console.log("headers: " JSON.stringify(res.headers));

res.on("data",function(chunk){
    console.log(Buffer.isBuffer(chunk));
    console.log(typeof chunk);
});

res.on("end",function(){
    console.log("comment success!");
});
});

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

req.write(postData);

req.end();
  

Мое первоначальное понимание шагов выглядит следующим образом :

1) http.request(urlRequest

2) function(res)

3) И последний возвращает класс ClientRequest var req

Но из кода кажется, что мое понимание неверно.

Это должен быть ClientRequest-class-object var req «записать» комментарии и

считайте это ‘end’ и затем запускайте callbackFn function(res) .

Пожалуйста, поделитесь своим мнением и расскажите мне больше об этом API.

Спасибо и наилучшие пожелания.

Ответ №1:

Кажется, что асинхронный характер http.request может вызывать у вас путаницу.

По сути, будет выполнен вызов запроса — это занимает некоторое время. Тем временем JS перейдет к req.write() и т.д.

Вам следует изучить отправители событий, вы уже используете их технически внутри обратного вызова запроса (например. res.on("data",function(chunk) ).

Возможно, лучшим решением было бы поместить вызовы вне запроса в другую функцию обратного вызова, которую вы затем вызываете внутри запроса. Это приведет к его вызову в конце запроса — о чем сигнализирует отправитель «end»:

 res.on("end",function(){
    console.log("comment success!");
    requestWrite();
});

function requestWrite(){
    req.write(postData);
    req.end();
}
  

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

1. Из вашего комментария, я полагаю, вы имеете req.write(postData); req.end(); в виду, что будет оправдано после function(res){res.on("end")} ? Но из кода видно, что ответ возвращается после отправки postData на сервер.

2. Да, это было по недосмотру с моей стороны, но я все еще не уверен, к чему вы клоните в этом комментарии. Не могли бы вы использовать событие ‘response’, генерируемое вашим вызовом http.response? Это может быть немного сложнее, чем вам нужно, но я бы просмотрел некоторые примеры кода здесь для поиска решений или даже просто идей.