.
Следующий код создаёт сервер, читающий тела запросов и отправляющий их в ответ потоком в виде текста из заглавных букв.
>var http = require("http");
>http.createServer(function(request, response) {
> response.writeHead(200, {"Content-Type": "text/plain"});
> request.on("data", function(chunk) {
> response.write(chunk.toString().toUpperCase());
> });
> request.on("end", function() {
> response.end();
> });
>}).listen(8000);
Переменная >chunk
, передаваемая обработчику данных, будет бинарным >Buffer
, который можно преобразовать в строку, вызвав его метод >toString
, который декодирует его с помощью кодировки по умолчанию (UTF-8).
Следующий код, будучи запущенным одновременно с сервером, отправит запрос на сервер и выведет полученный ответ:
>var http = require("http");
>var request = http.request({
> hostname: "localhost",
> port: 8000,
> method: "POST"
>}, function(response) {
> response.on("data", function(chunk) {
> process.stdout.write(chunk.toString());
> });
>});
>request.end("Hello server");
Пример пишет в >process.stdout
(стандартный вывод процесса, являющийся потоком с возможностью записи), а не в >console.log
. Мы не можем использовать >console.log
, так как он добавляет лишний перевод строки после каждого куска кода – это здесь не нужно.
Давайте скомбинируем наши новые знания о серверах HTTP и работе с файловой системой, и наведём мостик между ними: HTTP-сервер, предоставляющий удалённый доступ к файлам. У такого сервера много вариантов использования. Он позволяет веб-приложениям хранить и делиться данными, или может дать группе людей доступ к набору файлов.
Когда мы относимся к файлам, как к ресурсам HTTP, методы >GET
, >PUT
и >DELETE
можно использовать для чтения, записи и удаления файлов. Мы будем интерпретировать путь в запросе как путь к файлу.
Нам не надо открывать доступ ко всей файловой системе, поэтому мы будем интерпретировать эти пути как заданные относительно корневого каталога, и это будет каталог запуска скрипта. Если я запущу сервер из >/home/marijn/public/
(или >C:\Users\marijn\public\
на Windows), то запрос на >/file.txt
должен указать на >/home/marijn/public/file.txt
(или >C:\Users\marijn\public\file.txt
).
Программу мы будем строить постепенно, используя объект >methods
для хранения функций, обрабатывающих разные методы HTTP.
>var http = require("http"), fs = require("fs");
>var methods = Object.create(null);
>http.createServer(function(request, response) {
> function respond(code, body, type) {
> if (!type) type = "text/plain";
> response.writeHead(code, {"Content-Type": type});