Подтвердить что ты не робот

Мой http.createserver в node.js не работает?

Привет, ребята, я только начал изучать node.js сегодня и много искать в Интернете, а затем попытаюсь выполнить код в node.js, я использую эти два кода, чтобы показать мне тот же результат, но последний показывает ошибку в моем браузере, что-то нравится "не может найти страницу". Так объясните мне почему?

// JScript source code
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');

Это работает, но

// Include http module.
var http = require("http");

// Create the server. Function passed as parameter is called on every request made.
// request variable holds all request parameters
// response variable allows you to do anything with response sent to the client.
http.createServer(function (request, response) {
   // Attach listener on end event.
   // This event is called when client sent all data and is waiting for response.
   request.on("end", function () {
      // Write headers to the response.
      // 200 is HTTP status code (this one means success)
      // Second parameter holds header fields in object
      // We are sending plain text, so Content-Type should be text/plain
      response.writeHead(200, {
         'Content-Type': 'text/plain'
      });
      // Send data and end response.
      response.end('Hello HTTP!');
   });

}).listen(1337, "127.0.0.1");

Этот файл не работает

Почему?

Ссылка последнего, которая не работает http://net.tutsplus.com/tutorials/javascript-ajax/node-js-for-beginners/ Спасибо за все ответы, но я до сих пор не понимаю о проблемах. последний, который не работает, имеет request.on?

4b9b3361

Ответ 1

request - это экземпляр http.IncomingMessage, который реализует интерфейс stream.Readable.

Документация на http://nodejs.org/api/stream.html#stream_event_end говорит:

Событие: "конец"

Это событие срабатывает, когда больше данных не будет предоставлено.

Обратите внимание, что конечное событие не будет срабатывать, если данные полностью не будут потреблены. Это можно сделать, переключившись в текущий режим или, нажимая read() несколько раз, пока не дойдете до конца.

var readable = getReadableStreamSomehow();
readable.on('data', function(chunk) {
  console.log('got %d bytes of data', chunk.length);
})
readable.on('end', function() {
  console.log('there will be no more data.');
});

Итак, в вашем случае, потому что вы не используете либо read(), либо подписываетесь на событие data, событие end никогда не срабатывает.

Добавление

 request.on("data",function() {}) // a noop

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

Обратите внимание, что использование объекта запроса как потока необходимо только тогда, когда запрос HTTP имеет тело. Например. для запросов PUT и POST. В противном случае вы можете считать запрос уже законченным и просто отправить данные.

Если код, по которому вы отправляете сообщение, берется буквально с какого-либо другого сайта, возможно, этот пример кода был основан на Node 0.8. В Node 0,10 произошли изменения в работе потоков.

Из http://blog.nodejs.org/2012/12/20/streams2/

ПРЕДУПРЕЖДЕНИЕ. Если вы никогда не добавляете обработчик событий "data" или не вызываете resume(), он будет находиться в состоянии паузы навсегда и никогда не будет "end". Таким образом, код, который вы опубликовали, работал бы на Node 0.8.x, но не в Node 0.10.x.

Ответ 2

Функция, которую вы применяете к HTTP-серверу, это requestListener, которая снабжает двумя аргументами request и response, которые являются соответственно экземплярами http.IncomingMessage и http.ServerResponse.

Класс http.IncomingMessage наследует событие end из базового читаемого потока. Читаемый поток не находится в текущем режиме, поэтому конечное событие никогда не срабатывает, поэтому заставляя ответ никогда не записываться. Поскольку ответ уже доступен для записи, когда обработчик запроса запущен, вы можете просто написать ответ.

var http = require('http');

http.createServer(function(req, res) {
  res.writeHead(200, {
    'Content-Type': 'text/plain'
  });
  res.end('Hello HTTP!');
}).listen();