До сих пор сервер, который мы сделали, не имеет практического использования, поэтому мы начнем реализовать некоторые практические и полезные функции.
Что нам нужно сделать: пользователь выбирает файл, загружает файл, а затем видит загруженный файл в браузере.
Сначала нам нужен Textarea для пользователя, чтобы ввести контент, а затем отправить его на сервер через запрос POST.
Мы добавляем код в обработчик событий Start и изменяем requestHandlers.js следующим образом:
Кода -копия выглядит следующим образом:
Функция запуска (ответ) {
console.log ("запрос обработчика" был вызван.
var body = '<html>'+ '<head>'+
'<meta http-equiv = "content-type" content = "text/html;'+
'charset = utf-8 " />'+
'</head>'+
'<body>'+
'<form action = "/upload" method = "post">'+
'<textarea name = "text" row = "20" cols = "60"> </textarea>'+
'<input type = "Отправить" value = "Отправить текст" />'+
'</form>'+
'</body>'+
'</html>';
response.writehead (200, {"content-type": "text/html"});
response.write (тело);
response.end ();
}
функция загрузка (ответ) {
console.log («обработчик запроса» был вызван загрузкой '. »);
response.writehead (200, {"content-type": "text/plain"});
response.write ("Привет, загрузка");
response.end ();
}
exports.start = start;
exports.upload = upload;
Вы можете увидеть эффект, посетив http: // localhost: 8888/старт в вашем браузере.
Далее мы хотим реализовать запуск обработчика запроса /загрузки для обработки запроса POST, когда пользователь подает форму.
Чтобы сделать весь процесс, не блокирующий, node.js разделяет данные POST на множество небольших блоков данных, а затем передаст эти небольшие блоки данных в функцию обратного вызова, запуская конкретные события. Конкретные события здесь включают в себя событие данных (указывая на то, что появился новый небольший блок данных) и конечное событие (указывая на то, что все данные были получены).
Мы делаем это, зарегистрировав слушателя в объекте запроса. Объект запроса здесь передается в функцию обратного вызова OnRequest каждый раз, когда получается HTTP -запрос.
Мы размещаем код на сервер и изменяем Server.js следующим образом:
Кода -копия выглядит следующим образом:
var http = require ("http");
var url = require ("url");
Function Start (маршрут, ручка) {
функция OnRequest (запрос, ответ) {
var postdata = "";
var pathname = url.parse (request.url) .pathname;
console.log ("запрос на" + pathname + "получен.");
request.setencoding ("utf8");
request.addlistener ("data", function (postdatachunk) {
postdata += postdatachunk;
console.log («Полученные данные post data chunk '» + postdatachunk + «». »);
});
request.addlistener ("end", function () {
маршрут (ручка, pathname, response, postdata);
});
}
http.createserver (onrequest) .listen (8888);
console.log («Сервер начался»);
}
exports.start = start;
Приведенный выше код делает три вещи: сначала мы устанавливаем формат кодирования полученных данных UTF-8, а затем зарегистрируем слушатель для события «Data», чтобы каждый раз собирать новые блоки данных и назначать их с переменной PostData. Наконец, мы перемещаем вызов, просящий маршрут к конечному обработчику события, чтобы убедиться, что он будет стрелять только в случае получения всех данных, и только один раз стреляет. Мы также передаем данные POST для запроса маршрутов, потому что эти данные будут использоваться обработчиком запроса.
Далее, на странице /загрузке отобразите пользовательский ввод
Давайте изменим router.js:
Кода -копия выглядит следующим образом:
Функциональный маршрут (ручка, pathname, response, postdata) {
console.log ("ate to Mraking запрос на" + pathname);
if (typeof handle [pathname] === 'function') {
ручка [pathname] (ответ, postdata);
} еще {
console.log («Обработчик запроса не найден для» + pathname);
response.writehead (404, {"content-type": "text/plain"});
response.write («404 не найден»);
response.end ();
}
}
exports.route = route;
Затем, в requestHandlers.js, мы включаем данные в ответ на запрос на загрузку:
Кода -копия выглядит следующим образом:
function start (response, postdata) {
console.log ("запрос обработчика" был вызван.
var body = '<html>'+
'<head>'+
'<meta http-equiv = "content-type" content = "text/html;'+
'charset = utf-8 " />'+
'</head>'+
'<body>'+
'<form action = "/upload" method = "post">'+
'<textarea name = "text" row = "20" cols = "60"> </textarea>'+
'<input type = "Отправить" value = "Отправить текст" />'+
'</form>'+
'</body>'+
'</html>';
response.writehead (200, {"content-type": "text/html"});
response.write (тело);
response.end ();
}
функция загрузка (ответ, postdata) {
console.log («обработчик запроса» был вызван загрузкой '. »);
response.writehead (200, {"content-type": "text/plain"});
response.write («Вы отправили:» + postdata);
response.end ();
}
exports.start = start;
exports.upload = upload;
Последнее, что нам нужно сделать, это: в настоящее время мы передаем весь тело сообщения запроса на маршрутизацию запроса и обработчик запросов. Мы должны перенести только данные о сообщении, часть нас интересует, к обработчикам маршрутизации запросов и обработчикам запросов. В нашем примере нас интересует текстовое поле.
Мы можем использовать модуль QueryString, введенный ранее для его реализации:
Кода -копия выглядит следующим образом:
var QueryString = require ("queryString");
function start (response, postdata) {
console.log ("запрос обработчика" был вызван.
var body = '<html>'+
'<head>'+
'<meta http-equiv = "content-type" content = "text/html;'+
'charset = utf-8 " />'+
'</head>'+
'<body>'+
'<form action = "/upload" method = "post">'+
'<textarea name = "text" row = "20" cols = "60"> </textarea>'+
'<input type = "Отправить" value = "Отправить текст" />'+
'</form>'+
'</body>'+
'</html>';
response.writehead (200, {"content-type": "text/html"});
response.write (тело);
response.end ();
}
функция загрузка (ответ, postdata) {
console.log («обработчик запроса» был вызван загрузкой '. »);
response.writehead (200, {"content-type": "text/plain"});
response.write («Вы отправили текст:»+ QueryString.parse (postdata) .Text);
response.end ();
}
exports.start = start;
exports.upload = upload;
ОК, вышеупомянутое дело о обработке данных.
В следующем разделе мы будем реализовать функцию загрузки изображений.