Выразительный JavaScript (Хавербеке) - страница 221

.

Следующий код создаёт сервер, читающий тела запросов и отправляющий их в ответ потоком в виде текста из заглавных букв.

>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});