2016-03-20 1 views
0

Целью этого упражнения является создание HTTP-сервера, который обслуживает один и тот же текстовый файл для каждого полученного им запроса. Вот мой код. Это не работает.HTTP-серверы файлов и метод .writeHead

var http = require ('http'); 
    var fs = require ('fs'); 
    var port = process.argv[2]; 
    var file = process.argv[3]; 
    var bl = require ('bl'); 

var server = http.createServer(function (request, response) { 
    var stream = fs.createReadStream(file); 
    var streamPipe = stream.pipe(response); 
    response.write(streamPipe); 
    }); 

server.listen(port); 

Я проверил правильный ответ, и это поместить следующий код в первой строке функции, и удалить мой response.write() метод:

response.writeHead(200, { 'content-type': 'text/plain' }); 

вместо моего кода , который я думал бы написать данные по трубам из потока запроса в поток ответа (строка 10):

response.write(streamPipe) 

Я не понимаю. Должен ли response.writeHead идти после того, как поток установлен с использованием метода .createReadStream, а не раньше?

Не отправляю ли уже существующие данные с ответом.write()? Я хочу, чтобы это возвращало строку, а не объект, но сначала параметр должен быть строкой, иначе это не сработает. Метод toString() возвращает [object Object].

Может кто-нибудь объяснить параметры метода writeHead и почему это происходит раньше всего?

Я понимаю, что это загруженный вопрос. Я новичок в узле, очень рад узнать, но мне просто трудно понять это. У меня довольно простой опыт работы с JavaScript и некоторые Java, поэтому я ценю любую помощь для начинающего разработчика node.js.

ответ

0

Каждый ответ HTTP имеет три свойства: состояние, заголовки и контент (который может быть пустым).

Статус просто сообщает статус ответа, например. 200 OK, 404 Not Found, 500 Internal Server Error и т.д.

Заголовки представляет собой последовательность key: value пар, которые содержат различные мета-данные о реакции, как Content-Type: text/plain или Content-Length: 123456. Некоторые из них являются обязательными, как Content-Length (на самом деле есть случай, когда это не так, то есть кодирование с чередованием), а другие нет.

И, наконец, контент - это всего лишь последовательность байтов.

И, кроме того, это точно такой порядок в потоке ответа HTTP. Сначала есть статус, затем заголовки и в конце контента.

Итак, вы всегда вызываете метод response.writeHead как первый, потому что этот метод отправляет клиенту статус и заголовки. Он принимает пару (status_code, headers_object) в качестве аргументов, где status_code - всего лишь число, а headers_object - это объект {key1: value1, key2: value2}, который будет преобразован в последовательность заголовков.

Наконец response.write метод отправляет клиенту часть содержимого. Он принимает строку в качестве аргумента.

Подробнее о методах реагирования здесь: https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback

Обратите внимание, что вы не используете response.write метод явно в вашем примере, потому что stream.pipe(response) делает, что под капотом для вас. Прочтите следующее:

https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options

+0

Очень полезно. Я проверил документацию. Последующие действия q - можете ли вы объяснить в терминах непрофессионала, что именно происходит с stream.pipe (response)? Он отправляет данные из источника в ответ, не так ли? В том числе метод response.writeHead() устранил мою проблему и отправил строку содержимого, но это происходит до того, как этот «труба» даже установлен. Это очень смущает меня. – Streamer

+0

@ Азураски Вы можете обрабатывать 'response' как поток. Итак, первое, что вы отправляете в этот поток, - это состояние и заголовки (т. Е. Вы вызываете '.writeHead()'). Но поток все еще открыт. Итак, теперь вы вызываете 'stream.pipe (response)', который отправляет все из прочитанного потока 'stream' в перезаписываемый поток' response'. Таким образом, вы заполняете содержание ответа. Вот почему '.writeHead' должно произойти до' .pipe'. Обратите внимание, что (по умолчанию) '.pipe' автоматически закрывает поток' response' после этого. Надеюсь, теперь это ясно. Не стесняйтесь задавать больше вопросов. :) – freakish

Смежные вопросы