update
This commit is contained in:
parent
962caebbb7
commit
87bf53d076
1825 changed files with 94929 additions and 0 deletions
136
3-more/10-ajax/2-ajax-nodejs/article.md
Normal file
136
3-more/10-ajax/2-ajax-nodejs/article.md
Normal file
|
@ -0,0 +1,136 @@
|
|||
# Node.JS для решения задач
|
||||
|
||||
В этом разделе предлагаются задачи по теме AJAX.
|
||||
|
||||
Конечно же, они требуют взаимодействия с сервером. Чтобы не давать преимущества ни одному из серверных языков программирования ;), мы будем использовать серверную часть, написанную на <a href="http://nodejs.org">Node.JS</a>.
|
||||
|
||||
[cut]
|
||||
|
||||
Если вы не использовали Node.JS ранее -- не беспокойтесь. Здесь нашей целью является преимущественно клиентская часть, поэтому прямо сейчас изучать Node.JS не обязательно. Серверные скрипты уже готовы. Нужно только поставить и добавить модулей, чтобы их запускать.
|
||||
|
||||
|
||||
## Установка
|
||||
|
||||
Для настройки окружения будет достаточно сделать два шага:
|
||||
|
||||
<ol>
|
||||
<li>Сначала установите сам сервер Node.JS.
|
||||
|
||||
Если у вас Unix-система -- рекомендуется собрать последнюю версию из исходников, а также NPM. Вы справитесь.
|
||||
|
||||
Если Windows -- посетите сайт <a href="http://nodejs.org">http://nodejs.org</a> или скачайте установщик (32 или 64-битный) с расширением `.msi` из <a href="http://nodejs.org/dist/latest/">http://nodejs.org/dist/latest/</a>.
|
||||
</li>
|
||||
<li>Выберите директорию, в которой будете решать задачи. Запустите в ней:
|
||||
|
||||
```
|
||||
npm install node-static
|
||||
```
|
||||
|
||||
Это установит в текущую директорию модуль [node-static](https://github.com/cloudhead/node-static), который станет автоматически доступным для скриптов из поддиректорий.
|
||||
|
||||
**Если у вас Windows и команда не сработала, то скорее всего дело в том, что "не подхватились" новые пути. Перезапустите ваш файловый менеджер или консоль.**
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
## Проверка
|
||||
|
||||
Проверьте инсталяцию.
|
||||
|
||||
Для этого:
|
||||
<ol>
|
||||
<li>Создайте какую-нибудь поддиректорию и в ней файл `server.js` с таким содержимым:
|
||||
|
||||
```js
|
||||
var http = require('http');
|
||||
var static = require('node-static');
|
||||
var file = new static.Server('.');
|
||||
|
||||
http.createServer(function (req, res) {
|
||||
file.serve(req, res);
|
||||
}).listen(8080);
|
||||
|
||||
console.log('Server running on port 8080');
|
||||
```
|
||||
|
||||
</li>
|
||||
<li>Запустите его: `node server.js`.
|
||||
|
||||
Должно вывести:
|
||||
|
||||
```
|
||||
Server running on port 8080
|
||||
```
|
||||
|
||||
[warn header="Нельзя запустить больше одного сервера одновременно!"]
|
||||
При попытке запуска двух серверов (например, в разных консолях) -- будет конфликт портов и ошибка.
|
||||
[/warn]
|
||||
|
||||
</li>
|
||||
<li>Откройте в браузере <a href="http://127.0.0.1:8080/server.js">http://127.0.0.1:8080/server.js</a>.
|
||||
|
||||
Должно вывести код файла `server.js`.</li>
|
||||
</ol>
|
||||
|
||||
Если всё работает -- отлично, теперь вы готовы решать задачи.
|
||||
|
||||
## Примеры
|
||||
|
||||
В примерах, за редким исключением, для краткости будет приводиться не полный скрипт на Node.JS, а только код обработки запроса.
|
||||
|
||||
Например, вместо:
|
||||
|
||||
```js
|
||||
var http = require('http');
|
||||
var url = require('url');
|
||||
var querystring = require('querystring');
|
||||
|
||||
function accept(req, res) {
|
||||
|
||||
res.writeHead(200, {
|
||||
'Content-Type': 'text/plain',
|
||||
'Cache-Control': 'no-cache'
|
||||
});
|
||||
|
||||
res.end("OK");
|
||||
}
|
||||
|
||||
http.createServer(accept).listen(8080);
|
||||
```
|
||||
|
||||
...Будет только функция `accept`, или даже только её содержимое:
|
||||
|
||||
```js
|
||||
res.writeHead(200, {
|
||||
'Content-Type': 'text/plain',
|
||||
'Cache-Control': 'no-cache'
|
||||
});
|
||||
```
|
||||
|
||||
## Основные методы
|
||||
|
||||
В функции `accept` используются два объекта:
|
||||
<ul>
|
||||
<li>`req` -- объект запроса ("request"), из него читаем данные.</li>
|
||||
<li>`res` -- объект ответа ("response"), в него пишем данные.
|
||||
<ul>
|
||||
<li>вызов `res.writeHead(HTTP-код, [строка статуса], {заголовки})` пишет заголовки.</li>
|
||||
<li>вызов `res.write(txt)` пишет текст в ответ.</li>
|
||||
<li>вызов `res.end(txt)` -- завершает запрос ответом.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
## Демо
|
||||
|
||||
Кроме просмотра кода, можно будет попробовать и скачать различные демки.
|
||||
|
||||
Вот пример демо, можете попробовать нажать на кнопку -- она работает.
|
||||
|
||||
|
||||
[iframe src="example" border="1" zip]
|
||||
|
||||
Если хотите посмотреть пример поближе и поиграть с ним -- скачайте полный код, он будет работать и на вашем Node.JS.
|
||||
|
||||
## Больше о Node.JS
|
||||
|
||||
Больше о сервере Node.JS можно узнать в [скринкасте по Node.JS](/nodejs-screencast).
|
0
3-more/10-ajax/2-ajax-nodejs/example/.zip
Executable file
0
3-more/10-ajax/2-ajax-nodejs/example/.zip
Executable file
35
3-more/10-ajax/2-ajax-nodejs/example/index.html
Executable file
35
3-more/10-ajax/2-ajax-nodejs/example/index.html
Executable file
|
@ -0,0 +1,35 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head><meta charset="utf-8"></head>
|
||||
<body>
|
||||
|
||||
<button onclick="vote()" id="button">Голосовать!</button>
|
||||
|
||||
<script>
|
||||
function vote() {
|
||||
button.innerHTML = ' ... ';
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
|
||||
xhr.open('GET', 'vote', true);
|
||||
|
||||
xhr.onreadystatechange = function() {
|
||||
if (xhr.readyState != 4) return;
|
||||
|
||||
if (xhr.status != 200) {
|
||||
// обработать ошибку
|
||||
alert('Ошибка ' + xhr.status + ': ' + xhr.statusText);
|
||||
return;
|
||||
}
|
||||
|
||||
// обработать результат
|
||||
button.innerHTML = xhr.responseText;
|
||||
}
|
||||
|
||||
xhr.send(null);
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
31
3-more/10-ajax/2-ajax-nodejs/example/index.js
Executable file
31
3-more/10-ajax/2-ajax-nodejs/example/index.js
Executable file
|
@ -0,0 +1,31 @@
|
|||
var http = require('http');
|
||||
var url = require('url');
|
||||
var querystring = require('querystring');
|
||||
var static = require('node-static');
|
||||
var file = new static.Server('.');
|
||||
|
||||
|
||||
function accept(req, res) {
|
||||
|
||||
// если URL запроса /vote, то...
|
||||
if (req.url == '/vote') {
|
||||
// через 1.5 секунды ответить сообщением
|
||||
setTimeout(function() {
|
||||
res.end('Ваш голос принят: ' + new Date());
|
||||
}, 1500);
|
||||
} else {
|
||||
// иначе считаем это запросом к обычному файлу и выводим его
|
||||
file.serve(req, res); // (если он есть)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// ------ этот код запускает веб-сервер -------
|
||||
|
||||
if (!module.parent) {
|
||||
http.createServer(accept).listen(8080);
|
||||
} else {
|
||||
exports.accept = accept;
|
||||
}
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue