Node js server side javascript работает. Пройдя курс, вы научитесь

от RisingStack . Переведено с разрешения правообладателей.

В этой главе я расскажу вам о том, как вы можете запустить простой HTTP-сервер на Node.js и начать обрабатывать запросы.

Модуль http для вашего Node.js-сервера

Когда вы начинаете создавать HTTP-приложения в Node.js, встроенные модули http/https - это то, с чем вы будете взаимодействовать.

Давайте создадим ваш первый HTTP-сервер на Node.js! Нам будет нужно подключить модуль http и привязать наш сервер к порту 3000 .

// содежимое index.js
const http = require("http")
const port = 3000 const requestHandler = (request, response) => {
console.log(request.url)
response.end("Hello Node.js Server!")
} const server = http.createServer(requestHandler) server.listen(port, (err) => {
if (err) {

})

Затем запускаем этот скрипт:

$ node index.js

Что нужно здесь отметить:

  • requestHandler: эта функция будет вызываться каждый раз, когда на сервер придёт запрос. Если вы откроете в своём браузере адрес localhost:3000 , два сообщения появятся в консоли: одно для / и одно для favicon.ico .
  • if (err) : обработка ошибок: если порт уже занят или есть какие-то другие причины, по которым сервер не может быть запущен, мы получим уведомление об этом.

Модуль http крайне низкоуровневый: создание сложного веб-приложения с использованием вышеприведенного фрагмента кода очень трудоемко. Именно по этой причине мы обычно выбираем фреймворки для работы над нашими проектами. Есть множество фреймворков, вот самые популярные:

  • express
  • hapi
  • koa
  • restify

В этой и следующих главах мы будем использовать Express, так как именно для него вы можете найти множество модулей в NPM.

ExpressБыстрый, гибкий, минималистичный веб-фреймворк для Node.js -  http://expressjs.com/

Добавление Express в ваш проект - это просто установка через NPM:

$ npm install express --save

После того, как вы установили Express, давайте посмотрим, как создать приложение аналогичное тому, что мы написали ранее:


const app = express()
const port = 3000 app.get(‘/’, (request, response) => {
response.send("Hello from Express!")
}) app.listen(port, (err) => {
if (err) {
return console.log("something bad happened", err)
} console.log(`server is listening on ${port}`)
})

Самое большое различие, которое вы можете здесь заметить, заключается в том, что Express по умолчанию даёт вам роутер. Вам не нужно вручную разбирать URL, чтобы решить, что делать, вместо этого вы определяете маршрутизацию приложения с помощью app.get , app.post , app.put и так далее, а они уже транслируются в соответствующие HTTP-запросы.

Одна из самых мощных концепций, которую реализует Express - это паттерн Middleware.

Middleware - промежуточный обработчик

Вы можете думать о промежуточных обработчиках как о конвейерах Unix, но для HTTP-запросов.

На диаграмме вы можете увидеть, как запрос идёт через условное Express-приложение. Он проходит через три промежуточных обработчика. Каждый обработчик может изменить этот запрос, а затем, основываясь на вашей бизнес-логике, третий middleware отправит ответ, либо запрос попадёт в обработчик соответствующего роута.

На практике вы можете сделать это следующим образом:

Const express = require("express")
const app = express() app.use((request, response, next) => {
console.log(request.headers)
next()
}) app.use((request, response, next) => {
request.chance = Math.random()
next()
}) app.get("/", (request, response) => {
response.json({
chance: request.chance
})
}) app.listen(3000)

Что следует здесь отметить:

  • app.use: это то, как вы можете описать middleware. Этот метод принимает функцию с тремя параметрами, первый из которых является запросом, второй - ответом, а третий - коллбеком next . Вызов next сигнализирует Express о том, что он может переходить к следующему промежуточному обработчику.
  • Первый промежуточный обработчик только логирует заголовки и мгновенно вызывает следующий.
  • Второй добавляет дополнительное свойство к запросу - это одна из самых мощных функций шаблона middleware. Ваши промежуточные обработчики могут добавлять дополнительные данные к объекту запроса, который могут считывать/изменять middleware, расположенные ниже.
Обработка ошибок

Как и во всех фреймворках, правильная обработка ошибок имеет решающее значение. В Express вы должны создать специальный промежуточный обработчик - middleware с четырьмя входными параметрами:

Const express = require(‘express’)
const app = express() app.get(‘/’, (request, response) => {
throw new Error(‘oops’)
}) app.use((err, request, response, next) => {
// логирование ошибки, пока просто console.log
console.log(err)
response.status(500).send(‘Something broke!’)
}) app.listen(3000)

Что следует здесь отметить:

  • Обработчик ошибок должен быть последней функцией, добавленной с помощью app.use .
  • Обработчик ошибок принимает коллбек next . Он может использоваться для объединения нескольких обработчиков ошибок.
Рендеринг HTML

Ранее мы рассмотрели, как отправлять JSON-ответы. Пришло время узнать, как отрендерить HTML простым способом. Для этого мы собираемся использовать пакет handlebars с обёрткой express-handlebars .

Сначала создадим следующую структуру каталогов:

├── index.js
└── views
├── home.hbs
└── layouts
└── main.hbs

После этого заполните index.js следующим кодом:

// index.js
const path = require("path")
const express = require("express")
const exphbs = require("express-handlebars")
const app = express() app.engine(".hbs", exphbs({
defaultLayout: "main",
extname: ".hbs",
layoutsDir: path.join(__dirname, "views/layouts")
}))
app.set("view engine", ".hbs")
app.set("views", path.join(__dirname, "views"))
app.listen(3000)

Приведенный выше код инициализирует движок handlebars и устанавливает каталог шаблонов в views/layouts . Это каталог, в котором будут храниться ваши шаблоны.

После того, как вы сделали эту настройку, вы можете поместить свой начальный html в main.hbs . Чтобы всё было проще, давайте сразу перейдём к этому:



Express handlebars


{{{body}}}

Вы можете заметить метку {{{body}}}  - здесь будет размещен ваш контент. Давайте создадим home.hbs !

Hello {{name}}

Последнее, что мы должны сделать, чтобы заставить всё это работать, - добавить обработчик маршрута в наше приложение Express:

App.get("/", (request, response) => {
response.render("home", {
name: "John"
})
})

Метод render принимает два параметра:

  • Первый - это имя шаблона.
  • Второй - данные, необходимые для рендеринга.

Как только вы сделаете запрос по этому адресу, вы получите что-то вроде этого:



Express handlebars


Hello John

Это всего лишь верхушка айсберга. Чтобы узнать, как добавить больше шаблонов (и даже частичных), обратитесь к официальной документации express-handlebars .

Отладка Express

В некоторых случаях вам может потребоваться выяснить, что происходит с Express, когда приложение работает. Для этого вы можете передать следующую переменную окружения в Express: DEBUG=express* .

Вы должны запустить свой Node.js HTTP-сервер, используя:

$ DEBUG=express* node index.js

Резюме

Вот как вы можете настроить свой первый HTTP-сервер на Node.js с нуля. Я рекомендую Express для начала, а затем поэкспериментируйте.

Крэйга Батлера, "Станет ли когда-нибудь server-side Javascript модным среди разработчиков", лишний раз убеждаешься, что люди воспринимают JavaScript исключительно однотипно. Большинство девелоперов рассматривает его сугубо в контексте браузера. Во многом потому, что существует определённая путаница между самим языком и DOM’ом браузера. DOM интерфейс - это, собственно, и есть то место, где JavaScript девелоперы проводят большую часть своего рабочего времени. Там же можно найти подтверждение ещё одному факту - многие люди терпеть не могут JavaScript. Хотя я всё равно уверен, что те люди, которые ценят лучшие качества JavaScript и закрывают при этом глаза на его недостатки, вряд ли удивлены тому, что JavaScript собирается потихоньку перебираться на выполнение сервером. Скорее всего они еще и рады этому. И, поверьте, это только начало!

Итак, где же серверный JavaScript можно найти сейчас? Jaxer – это фреймворк и сервер для разработки веб приложений на JavaScript. Серверный API не страдает от недостатка предоставляемых возможностей, включая доступ к файлам, базам данных и сетевым сокетам. Граница между применением серверных и пользовательских скриптов достаточно размыта, к примеру, с помощью тех же серверных скриптов можно манипулировать DOM’ом веб-странички. Такие скрипты придают вашему HTML коду толику ASP-стиля. var nme = document.createTextNode("Hello my name is Jaxer."); var para = document.getElementById("name"); para.appendChild(nme); В данном случае у атрибута Runat может быть три значения – server, both , и server-proxy . Если назначить значение server, скрипт выполняется ещё до отправки страницы браузеру. Иначе его обработка происходит уже на клиентской стороне. Если установлено значение server-proxy, функция может быть вызвана из client-side скриптов по имени, но будет проксироваться с помощью Ajax на свой server-side эквивалент. Helma - это еще один фреймворк для написания JavaScript скриптов, выполняемых на стороне сервера. Helma имеет шаблонную систему, которая помогает избежать смешивания server-side и client-side кода. Здесь, вместо того, чтобы прописывать действия JavaScript, которые затем рендерят темплейт, вы вводите данные в сам процесс рендеринга. Каждый HTTP запрос, таким образом, инициирует выполнение сконфигурированного действия. Вот пример шаблона, или, если использовать Helma-жаргон, "скина", названный "hello": А вот action, которые рендерит его: res.data.name = "Helma"; this.renderSkin("hello"); Судя по теме в Википедии, есть немало других примеров “серверного” JavaScript . Почти во всех из них используется Rhino или SpiderMonkey для выполнения скриптов. Серверный JavaScript. Насколько это всё серьёзно? Реализации выполнения скриптов JavaScript на сервере, как видим, уже начинают появляться, но, в любом случае, по популярности им, так или иначе, очень далеко до повсеместного использования PHP. Отметим, что это вполне справедливо, ведь server-side JavaScript в настоящее время ограничен своим фреймворком. Такие JavaScript скрипты, написанные в одной среде вряд ли могут быть портированы из-за отсутствия стандартного API. Впрочем работа над этой проблемой уже началась в рамках ServerJS Group . Да и проекты типа jslibs также должны посодействовать её решению. Отсутствие подходящего хостинга также является острым вопросом, хотя Jaxer и AppJet и представляют свои собственные хостинг-платформы, а Helma приложения можно разместить на любых поддерживающих Java хостинг-решениях. После того, как проблема создания стандартной библиотеки будет решена, я уверен, мы увидим, что хостинг-поддержка будет улучшаться и расширяться и вы сами будете требовать у вашего хостера "mod_javascript" поддержку. Наконец, JavaScript имеет более чем достаточно шероховатостей и недостатков, заставляющих многих разработчиков сомневаться о целесообразности его использовании в качестве server-side решения. Но я думаю, что выход ECMAScript 3.1 должен серьёзно поколебать их уверенность в этом. Нетрудно заметить, что поддержка JavaScript стала появляться во многих платформах – и веб и десктопных, локальных и серверных. Будет ли серверная JavaScript поддержка предлагаться в хостинговых планах также повсеместно, как и PHP? Я думаю, это неизбежно.

На сервере (IIS) по следующим причинам:

Передача навыков - мы хотели бы использовать JavaScript и jQuery на сервере и не использовать, например, VB Script./классический asp. .Net framework/Java и т. Д. Исключается из-за этого.

Улучшены параметры поиска/доступности. Мы хотели бы иметь возможность использовать jQuery в качестве системы шаблонов, но это небезопасно для поисковых систем и пользователей с отключенным - если мы не можем выборочно запускать этот код на сервере.

В IIS и Windows Server есть значительные инвестиции, поэтому изменение не является вариантом.

Я знаю, что вы можете запускать jScript в IIS с помощью хоста Windows Script, но я не уверен в масштабируемости и процессе, связанном с этим. Я также не уверен, что это будет иметь доступ к DOM.

Вот диаграмма, которая, надеюсь, объясняет ситуацию. Мне было интересно, если кто-нибудь сделал что-нибудь подобное?

EDIT: я не ищу критика в веб-архитектуре, я просто хочу знать, есть ли какие-либо возможности для манипулирования DOM страницы, прежде чем она будет отправлена ​​клиенту, используя javascript. Jaxer - один из таких продуктов (без IIS). Спасибо.

5 7 ответы

Идея повторного использования клиентского JS на сервере может казаться соблазнительной, но я не уверен, что сам jQuery будет готов к запуску в серверной среде.

Вам нужно будет определить глобальный контекст для jQuery каким-то образом, инициализируя окно, документ, имя пользователя, местоположение и т. Д. . Я не уверен, что это выполнимо.

Кроме того, как отметил Cheeso, Active Server Pages - очень устаревшая технология, в начале века она была заменена на ASP.Net Microsoft. Раньше я использовал систему устаревания с использованием ASP 3.0 более года, и это было больно. Самое замечательное времяпрепровождение - отладка: вы вряд ли найдете что-нибудь для этой цели сегодня и должны будете ослабить красивые ошибки, как в журнале IIS:

ошибка "800a9c68"
Определенная пользователем или объектная ошибка

Тем не менее, я могу подтвердить, что мне удалось повторно использовать клиентский и серверный JScript. Но это был код, написанный мной, который знал, что он будет использоваться на сервере.

JScript работает в IIS с помощью ASP. Активные серверные страницы.
Он был впервые доступен в 1996 году.

В конце концов ASP.NET был представлен как преемник. Но ASP по-прежнему поддерживается.

Однако для DOM-страницы нет DOM.

Возможно, вам придется немного пересмотреть свою архитектуру.

Я думаю, что единственные жизнеспособные решения, которые вы, вероятно, найдете в любом месте рядом с готовыми к работе, включают в себя размещение IIS перед Java. Есть две браузерные среды, которые я знаю о закодированных для Java:

Если вы хотите что-то чистое-IIS/MS, я думаю, что ваше наблюдение за хостом WindowsScript и/или чем-то вроде полузаброшенного JScript.NET, вероятно, примерно так же близко, как и вы, а также порт (который вы, вероятно, придется начинать) с чем-то вроде Env-js или HTMLUnit.

Кроме того, я не знаю, видели ли вы список решений на стороне сервера в Википедии:

Наконец... вы, вероятно, могли бы написать пригодную для использования jQuery-подобную библиотеку на любом языке, на котором уже есть какая-то библиотека DOM и первоклассные функции (или, если это невозможно, eval). См. Например, pQuery для Perl (http://metacpan.org/pod/pQuery). Это даст вам преимущества стиля jQuery для манипулирования документами. Передача навыков велика, и у JavaScript есть замечательное слияние очень приятных функций, но, с другой стороны, разработчики, которые заботятся о том, чтобы изучать несколько языков, также великолепны, а - не единственный приятный язык.

Что именно вы подразумеваете под

На данный момент множество разработчиков говорят о Node.js , создавая высоконагруженные приложения, работающие в реальном времени. С Node.js вы можете использовать JavaScript как на клиенте, так и на сервере. В данном туториале мы установим Node и создадим вашу первую "Hello World" программу - масштабируемый сервер для стриминга Twitter сообщений.

Что такое Node.js?

Чаще всего JavaScript выполняется исключительно на стороне клиента, веб-браузера, но с недавних пор разработчики заинтересовались использование его на сервере, во многом благодаря проекту CommonJS . Из других заметных серверных JavaScript сред стоить отметить Jaxer и Narwhal . Однако Node.js отличается от подобных решений, так как в своей основе он работает следуея концепции событий, нежели потоков. Веб-сервер Apache к примеру, который обрабатывает PHP и другие CGI скрипты, основан на потоках, он создает отдельный поток для каждого запроса. Конечно этот подход работает для большинства приложений, однако модель основанная на потоках не подходит для приложений с продолжительным подключение в реальном времени, на подобии приложений как Friendfeed и Google Wave .

"Каждое действие с вводом/выводом (I/O) - асинхронное..."

Node.js использует цикл событий вместо потоков и способен поддерживать миллионы одновременных соединений. Недостаток данной модели заключается в том, что большинство серверов тратят большую часть времени ожидая операций по вводу/выводу, такие операции как чтение файла с жёсткого диска, получения доступа к удалённому веб-серверу или ожидание конца загрузки файл, данные операции гораздо медленнее, чем операции по работе с памятью. Каждое действие с вводом/выводом - асинхронное, это означает, что сервер может продолжать обрабатывать входящие запросы, во время операций по вводу/выводу. JavaScript отлично подходит для программирования основанного на событиях, он обладает анонимными функциями и замыканиями, что позволяет с легкостью создавать каллбеки и JavaScript разработчики уже знакомы с подобным способом программирования. Данная событийная модель делает Node.js невероятно быстрым и позволяет без проблем масштабировать приложения в реальном времени.

Шаг 1 установка

Node.js работает на Unix подобных системах, к примеру Mac OS X, Linux b FreeBSD. К сожалению Windows не поддерживается на данный момент времени, так что если вы пользователь Windows, можно воспользоваться установленной на Virtualbox Ubuntu. Чтобы это сделать, ознакомтесь со . Вы должны воспользоваться терминалом для установки и запуска Node.js.

  • Скачайте последний релиз Node.js с nodejs.org (на момент написания данной статьи, последняя версия - 0.1.31) и распакуйте zip архив.
  • Откройте терминал и запустите следующие команды. cd /path/to/nodejs make sudo make install

    Много сообщений будет показано в терминале во время установки и компиляции Node.js.

  • Шаг 2 Hello World!

    Любое знакомство с новой технологией начинается с туториала "Hello World!", мы создадим простой HTTP сервер, который будет отправлять данное сообщение. Однако для начала, вы должны понять систему модулей Node.js. В Node функционал инкапсулирован в модули и для того, чтобы он работал нам предварительно следует загрузить интересующий нас модуль. Существует множество модулей, со списком можно ознакомиться в Node.js документации . Загрузить модуль можно с помощью функции require:

    Var sys = require("sys");

    Данный пример загружает модуль sys, который содержит функции для выполнения системных задач, допустим вывод сообщения в терминал. Чтобы воспользоваться функцией модуля, вызовите её с помощью переменной в которую был сохранён данный модуль, в нашем случае sys .

    Sys.puts("Hello World!");

    Запуск этих двух строчек кода также прост, как запуск команды node с именем javascript файла в качестве аргумента.

    Node test.js

    Этот пример выведет "Hello World!" в терминал, после того, как будет запущен.

    Для создания HTTP сервера, нам нужно будет вызвать require для http модуля.

    Var sys = require("sys"), http = require("http"); http.createServer(function(request, response) { response.sendHeader(200, {"Content-Type": "text/html"}); response.write("Hello World!"); response.close(); }).listen(8080); sys.puts("Server running at http://localhost:8080/");

    Этот скрипт импортирует sys и http модули и создаёт HTTP сервер. Анонимная функция передаваемая в http.createServer будет вызвана, каждый раз когда совершается запрос к серверу. Как только сервер будет создан, он будет прослушивать порт 8080. Когда приходит запрос к серверу, сначала отправляем хедер с типом контента (content type) и статус кодом 200 - успешно (successful). Затем мы посылаем "Hello World!" и закрываем соединение. После чего вы можете заметить, как мы явно закрываем соединение. Таким образом мы можем просто передавать данные клиенту, не закрывая соединения. Если запустить данный скрипт и перейти по адресу в браузере - http://localhost:8080/ , вы увидите "Hello World!"

    Шаг 3 простой статичный файловый сервер

    Хорошо, мы создали HTTP сервер, но кроме "Hello World" ничего не посылается, не важно какой адрес мы введём. Любой HTTP должен быть способен посылать статичные файлы, такие как HTML, изображение и другие файлы. Код ниже делает следующее:

    Var sys = require("sys"), http = require("http"), url = require("url"), path = require("path"), fs = require("fs"); http.createServer(function(request, response) { var uri = url.parse(request.url).pathname; var filename = path.join(process.cwd(), uri); path.exists(filename, function(exists) { if(!exists) { response.sendHeader(404, {"Content-Type": "text/plain"}); response.write("404 Not Found\n"); response.close(); return; } fs.readFile(filename, "binary", function(err, file) { if(err) { response.sendHeader(500, {"Content-Type": "text/plain"}); response.write(err + "\n"); response.close(); return; } response.sendHeader(200); response.write(file, "binary"); response.close(); }); }); }).listen(8080); sys.puts("Server running at http://localhost:8080/");

    Мы начали, загрузив все необходимые нашему коду модули. Включая sys , http , url , path , также fs или модули для работы с файловой системой. Далее мы создаём HTTP сервер, как делали это раньше. На этот раз, мы используем модуль url для парсинга входящих URL запросов, который будет находить путь к запрашиваемому файлу. Мы нашли имя файла на жёстком диске сервере используя path.join , который объединяет process.cwd() , или текущую рабочую директорию, к пути запрашиваемого файла. Далее, мы проверяем существует-ли файл, это асинхронная операция, тем самым требует каллбека. Если файл не существует, сообщение 404 Not Found будет послано пользователю и произойдёт возврат функции. В противном случае, мы читаем файл используя модуль fs , используя бинарную кодировку и посылая файл пользователю. Если случится ошибка чтения файла, мы показываем сообщение ошибки пользователю и закрываем соединение. Так как всё это работает асинхронно, сервер будет в состоянии обрабатывать другие запросы, читая файл с диска, не важно насколько он большой.

    Запустив данный пример и открыв http://localhost:8080/path/to/file , файл будет показан в браузере.

    Шаг 4 стриминг твитов в реальном времени

    Используя уже работающий, статичный файловый сервер, мы создадим сервер на Node.js, который будет показывать твиты клиенту, которые будут обрабатываться статичным файловым сервером. Для начала нам понадобиться один дополнительный модуль для данного примера: модуль для работы с событиями - events . В Node существует концепция называемая EventEmitter , который используется для обработки слушателей событий (event listeners) для асинхронных задач. Также как jQuery или другие JavaScript фреймворки для клиентской части, когда вы привязываете (bind) слушатель события к таким вещям, как клики мышки и AJAX запросы, Node позволяет вам привязать слушатель событий ко многим вещам, некоторые мы уже использовали. Сюда можно включить все операции ввода/вывода, такие как чтение или запись файла, проверка существует-ли файл, ожидание HTTP запросов и так далее. EventEmitter абстрагирует логику связывания (binding), развязывания (unbinding) и вызвает слушатели событий. Мы используем EventEmitter посылая сигналы слушателю события, когда новые твиты будут загружены. Первые несколько строк нашего стримера твитов включают все необходимые модули и определяют функцию для обработки статичных файлов, которые были взяты из предыдущего примера.

    Var sys = require("sys"), http = require("http"), url = require("url"), path = require("path"), fs = require("fs"), events = require("events"); function load_static_file(uri, response) { var filename = path.join(process.cwd(), uri); path.exists(filename, function(exists) { if(!exists) { response.sendHeader(404, {"Content-Type": "text/plain"}); response.write("404 Not Found\n"); response.close(); return; } fs.readFile(filename, "binary", function(err, file) { if(err) { response.sendHeader(500, {"Content-Type": "text/plain"}); response.write(err + "\n"); response.close(); return; } response.sendHeader(200); response.write(file, "binary"); response.close(); }); }); }

    Ранее мы использовали http модуль для создания сервера, но кроме этого у нас есть возможность, с помощью модуля, создать HTTP клиент. Мы будем использовать HTTP клиент для загрузки твитов из публичного лога Twitter, для этого нам понадобится функция get_tweets .

    Var twitter_client = http.createClient(80, "api.twitter.com"); var tweet_emitter = new events.EventEmitter(); function get_tweets() { var request = twitter_client.request("GET", "/1/statuses/public_timeline.json", {"host": "api.twitter.com"}); request.addListener("response", function(response) { var body = ""; response.addListener("data", function(data) { body += data; }); response.addListener("end", function() { var tweets = JSON.parse(body); if(tweets.length > 0) { tweet_emitter.emit("tweets", tweets); } }); }); request.close(); } setInterval(get_tweets, 5000);

    Сперва мы создадим HTTP клиент на порту 80 для api.twitter.com, и создадим новый EventEmitter . Функция get_tweets создаёт HTTP "GET" запрос к публичному логу Twitter, и добавляется слушатель, который будет срабатывать когда сервер Twitter даст ответ. Так как Node.js асинхронный, данные из тела ответа приходят кусками, которые затем обрабатываются ответом "data" слушателя. Данный слушатель добавляет куски сообщения переменной body . Как только придут все кусочки сообщения, запустится слушатель "end", и мы распарсим входящие JSON данные. Если возвращается лишь одит твит, мы создадим событие "tweets" для нашего tweet_emitter , и передадим массив с новыми твитами. Это вызовет все слушатели событий для работы с событием "tweets", и посылает новые твиты каждому клиенту. Мы запрашиваем новые твиты каждые пять секунд, используя setInterval .

    Наконец мы должны создать HTTP сервер для обработки запросов.

    Http.createServer(function(request, response) { var uri = url.parse(request.url).pathname; if(uri === "/stream") { var listener = tweet_emitter.addListener("tweets", function(tweets) { response.sendHeader(200, { "Content-Type" : "text/plain" }); response.write(JSON.stringify(tweets)); response.close(); clearTimeout(timeout); }); var timeout = setTimeout(function() { response.sendHeader(200, { "Content-Type" : "text/plain" }); response.write(JSON.stringify()); response.close(); tweet_emitter.removeListener(listener); }, 10000); } else { load_static_file(uri, response); } }).listen(8080); sys.puts("Server running at http://localhost:8080/");

    Также как мы сделали со статичным файловым сервером, мы создадим HTTP сервер работающий на порту 8080. Мы обрабатываем входящий URL, и если URL - "/stream" , мы обработаем его, в другом случае мы передадим запрос отключения нашему статичному серверу. Стриминг представляет из себя слушатель, который будет отслеживать новые твиты от нашего tweet_emitter , которые будут отправляться функцией get_tweets . Мы также создали таймер, для остановки запросов, которые длятся больше 10 секунд, отправляя им пустой массив. Когда появляются новые твиты, мы отправляем эти твиты в качестве JSON данных и останавливаем таймер. Вы лучше поймёте как это работает изучив код на стороне клиента, который показан ниже. Сохраните его как test.html в туже директорию где находится серверный JavaScript.

    Tweet Streamer var tweet_list = $("#tweets"); function load_tweets() { $.getJSON("/stream", function(tweets) { $.each(tweets, function() { $("

  • ").html(this.text).prependTo(tweet_list); }); load_tweets(); }); } setTimeout(load_tweets, 1000);

    У нас имеется простая HTML страница, в которую добавляется библиотека jQuery и создан неупорядоченный список, куда мы будем вставлять твиты. Клиентский JavaScript кеширует список твитов и запускает функцию load_tweets , по прошествию одной секунды. Так браузеру даётся достаточно времени для завершения загрузки страницы, до того как мы совершим AJAX запрос к серверу. Функция load_tweets очень проста; она использует jQuery функция getJSON для загрузки /stream . Когда приходит ответ, мы обходим циклом все твиты и добавляем их к списку твитов. После этого снова вызывается функция load_tweets . Тем самым создаётся цикл, который эффективно загружает новые твиты, таймер останавливается через десять секунд по истечению таймаута на сервере. Каждый раз когда у нас есть новые твиты, они посылаются клиенту, который поддерживает непрерывное соединение с сервером. Данный метод называется long-pooling.

    Если запустить сервер с помощью node и открыть http://localhost:8080/test.html , вы увидете публичный лог твиттера в вашем браузере.

    Следующие шаги

    Node.js очень впечатляющая технология, с которой легко создать высоконагруженные приложение в реальном времени. Надеюсь вам удалось понять все преимущества и можете их использовать в собственных приложениях. Поскольку Node обладает отличной системой модулей, можно с легкостью использовать написанный ранее код для ваших приложений, также имеется большое количество сторонних модулей, созданных для чего угодно - включая соединение с базой данных, шаблонизаторы, почтовые клиенты и даже целые фреймворки соединяющие всё вместе взятое. Вы можете ознакомиться с полным списком модулей на вики Node.js , ещё больше туториалов могут быть найдены на How To Node . Я также рекомендую посмотреть видео с JSConf, в котором Ryan Dahl, создатель Node, объясняет философию стоящию позади создания и дизайна Node. Оно доступно.

    Надеюсь вам понравился данный туториал. Если у вас есть какие-либо комментарии, можно их оставить здесь, либо отправить сообщение на

    Node.js: серверный JavaScript

    Duration 27:19:05

    Курс рассчитан на веб-разработчиков с опытом разработки на языке JavaScript. В течение курса вы разработаете серверную часть для корпоративного приложения — внутренней системы взаимодействия между сотрудниками. Вымышленный корпоративный сайт. Новости, чат, панель администратора и пользовательские настройки — всё это вам будет необходимо реализовать во время обучения.

    Пройдя курс, вы научитесь

    Вести разработку на JavaScript в среде Node.js.
    JavaScript теперь используется и как серверный язык разработки. Среда Node.js позволяет любому разработчику, знакомому с JavaScript, начать разрабатывать серверную часть для приложений любой сложности. Начиная с основ, в процессе курса мы рассмотрим самые важные области Node.js.

    Использовать технологию WebSocket и библиотеку socket.io.
    Приложения реального времени в настоящее время — практически стандарт. Нет никакой необходимости в перезагрузках страницы, и не важно, нужно ли вам написать простенький чат, или высоконагруженный сервис. Сокеты помогут настроить обмен данными между клиентом и сервером с невероятной скоростью.

    Разворачивать готовый проект на хостинге.
    Для приложений, разработанных в среде Node.js, классический хостинг не подходит. Мы научимся разворачивать ваше приложение прямо из git-репозитория с максимальный комфортом на самых популярных подходящих площадках.

    Тестировать свой код.
    Тестирование кода — еще один очень важный момент, который нельзя обойти стороной, особенно, когда пишется серверная часть приложения. Написание тестов на существующий код повысит его надежность, а разработка через тестирование практически исключает возможность появления критических ошибок вашего приложения в дальнейшем.

    Применять практики серверного рендеринга.
    Серверный рендеринг — отнюдь не прихоть, а часто жизненно важный момент вашего приложения. В некоторых случаях, клиентский рендеринг делает SEO-продвижение попросту невозможным, а если вы хотите добиться максимальной скорости работы приложения при огромных количествах посещений, то серверный рендеринг — однозначно, ваш выбор.

    Использовать фреймворки Express.js и Koa.js в разработке.
    В среде Node.js, помимо модулей и подключаемых библиотек, существуют два замечательных фреймворка, которые значительно облегчают процесс разработки. Более того, некоторые из подключаемых библиотек, написаны именно под фреймворки. Мы рассмотрим два самых популярных и известных фреймворка для разработки в среде Node.js.

    Проводить аутентификацию и авторизацию, грамотно хранить персональные данные.
    В современном вебе практически не осталось места анонимности, при этом идентификация пользователей — крайне важный момент. Получаемые персональные данные должны храниться надежно и не использоваться без лишней необходимости. Мы рассмотрим лучшие практики и дополнительные библиотеки, облегчающие и повышающие надежность в этой части ваших приложений.

    Работать с реляционными и нереляционными базами данных под Node.js.
    При разработке серверной части приложения особое внимание стоит уделить работе с данными. Выбор базы данных для проекта — крайне важный процесс, поэтому мы рассмотрим самые часто используемые типы баз данных. Для примера нереляционных баз будет использована MongoDB, для примера реляционных — PostgreSQL.