Первые впечатления
от Node.js
Javascript
Источник: Google Trends
Почему Node.js?
1) Платформа стремительно набирает популярность
Почему Node.js?
2) Концепция платформы
● Frontend и Backend на одном языке. Появляются фреймворки,
которые идут дальше (MeteorJS) и позволяют перемещать код от
клиента к серверу и наоборот.
● Заточенность под high scale и высокую производительность: event-
loop в основе, неблокирующее асинхронное I/O, вызываемое event-
ами в тредах.
3) Полюбить фронтенд
● Frontend хорош концептуально - это то, что видит и трогает
пользователь.
● Не все любят, для меня это кошмар.
Принцип работы Node.js
Фреймворки
1) Sails
● Как пример для подражания был взят Rails.
● В основе лежит MVC-паттерн, где-то внутри спрятан Express.
● Внутри есть мощная ORM Waterfall.
● Многое доступно из коробки.
2) Express
● API reference умещается на одной странице.
● Низкоуровневый, ещё ниже - делать всё прямо на Node.js.
● Один из самых популярных фреймворков (сравнимый только
Connect, на основе которого он и сделан).
● Можно провести параллель: Express - Sinatra, Connect - Rack.
Фреймворк Sails
1. MVC-паттерн
2. Всё можно добавить командами:
3. Отдельные конфиги для всего: БД, роутов, CSRF,
локализации, ошибок, контроллеров и т.д.
4. Несколько template-движков: EJS, Jade
5. Livereload и автоматическая сборка
$ sails new testProject - создаём проект
$ sails generate controller comment create destroy tag like -
добавляем контроллер с экшенами
$ sails generate model - добавить модель (нету в стандартной
поставке, но есть механизм расширений)
Фреймворк Sails
6. ORM и встроенная валидация моделей
module.exports = {
tableName: 'twitter_blacklist',
migrate: 'safe',
autoCreatedAt: false,
autoUpdatedAt: false,
attributes: {
messageId: {
columnName: 'message_id',
type: 'text',
required: true
}
}
};
// Find entities
Broadcast
.find(options)
.sort("time DESC")
.done(function(err, broadcasts){
// some code
});
// Create entity
Broadcast
.create(broadcast)
.done(function(err, broadcast) {
// some code
});
Фреймворк Express
$ express myapp
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
// middleware setup
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
app.use('/users', users);
/// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
/// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
module.exports = app;
Фреймворк Express
1. Можно создавать какую угодно структуру и использовать
любую архитектуру.
2. Можно использовать ORM, а можно драйвер БД.
3. Express даёт несколько методов и объектов:
Основные методы:
app.use(middleware) - использовать middleware в
цепочке
app.all(‘/private’, requireAuthentihication) -
использовать middleware для любого запроса по
маске
app.route(‘/path’).get(getMethod).post
(postMethod)
или router.use(‘path’, method) - роутинг
app.listen(port) - запустить сервер
Объекты:
app.locals - объект,
доступный во всех
темлпейтах
req - http запрос
res - http ответ
Впечатления
1. Sails.js - слишком высокоуровневый, в реальном
приложении можно достаточно быстро попасть в
ситуацию, когда его возможностей не будет хватать, а
Express внутри себя он уже как-то инкапсулирует.
2. Express.js - фреймворк в самом расцвете лет. Уже есть
всё, что надо, и не навешено ничего лишнего. И скорее
всего не будет :)
3. Node.js - замечательный инструмент, очень динамично
развивается. Подходит для многих задач.
Если для ваших задач больше подходят слова
JSON и NoSQL, чем транзакции и enterprise, то
Node.js будет хорошим выбором.
2-ступенчатая транзакция
tx.query(SQL_APPLY_REQUEST, [code], function(err, res) {
if (err) {
console.log("Applying request error:" + err);
deferred.reject(err);
} else if (res.affectedRows !== 1) {
tx.rollback();
deferred.reject(new Error('WRONG_CODE'));
} else {
data.push(res);
tx.query(SQL_CREATE_ADMIN, [code], function(err, res) {
if (err) {
console.log("Creating admin error:" + err);
deferred.reject(err);
} else {
data.push(res);
tx.commit(function(err){
if (err) {
console.log("Error occurs during
creating admin:" + err);
deferred.reject(err);
} else {
var promise = findRequest(code);
promise.then(function(data) {
notify.process(data, 'request-
applied');
}, function(err) {
console.log("Cannot retrieve
request data from db");
});
deferred.resolve(data);
}
});
}
});
}
});
Спасибо за внимание!
1. Node.js - официальный сайт
2. Express.js - официальный сайт
3. Sails - официальный сайт
4. How do I get started with Node.js? на Stackoverflow
5. Art of Node на GitHub
6. Mixu’s Node Book

2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js

  • 1.
  • 2.
    Источник: Google Trends ПочемуNode.js? 1) Платформа стремительно набирает популярность
  • 3.
    Почему Node.js? 2) Концепцияплатформы ● Frontend и Backend на одном языке. Появляются фреймворки, которые идут дальше (MeteorJS) и позволяют перемещать код от клиента к серверу и наоборот. ● Заточенность под high scale и высокую производительность: event- loop в основе, неблокирующее асинхронное I/O, вызываемое event- ами в тредах. 3) Полюбить фронтенд ● Frontend хорош концептуально - это то, что видит и трогает пользователь. ● Не все любят, для меня это кошмар.
  • 4.
  • 5.
    Фреймворки 1) Sails ● Какпример для подражания был взят Rails. ● В основе лежит MVC-паттерн, где-то внутри спрятан Express. ● Внутри есть мощная ORM Waterfall. ● Многое доступно из коробки. 2) Express ● API reference умещается на одной странице. ● Низкоуровневый, ещё ниже - делать всё прямо на Node.js. ● Один из самых популярных фреймворков (сравнимый только Connect, на основе которого он и сделан). ● Можно провести параллель: Express - Sinatra, Connect - Rack.
  • 6.
    Фреймворк Sails 1. MVC-паттерн 2.Всё можно добавить командами: 3. Отдельные конфиги для всего: БД, роутов, CSRF, локализации, ошибок, контроллеров и т.д. 4. Несколько template-движков: EJS, Jade 5. Livereload и автоматическая сборка $ sails new testProject - создаём проект $ sails generate controller comment create destroy tag like - добавляем контроллер с экшенами $ sails generate model - добавить модель (нету в стандартной поставке, но есть механизм расширений)
  • 7.
    Фреймворк Sails 6. ORMи встроенная валидация моделей module.exports = { tableName: 'twitter_blacklist', migrate: 'safe', autoCreatedAt: false, autoUpdatedAt: false, attributes: { messageId: { columnName: 'message_id', type: 'text', required: true } } }; // Find entities Broadcast .find(options) .sort("time DESC") .done(function(err, broadcasts){ // some code }); // Create entity Broadcast .create(broadcast) .done(function(err, broadcast) { // some code });
  • 8.
    Фреймворк Express $ expressmyapp var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var routes = require('./routes/index'); var users = require('./routes/users'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); // middleware setup app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded()); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/users', users); /// catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); /// error handlers // development error handler // will print stacktrace if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); } module.exports = app;
  • 9.
    Фреймворк Express 1. Можносоздавать какую угодно структуру и использовать любую архитектуру. 2. Можно использовать ORM, а можно драйвер БД. 3. Express даёт несколько методов и объектов: Основные методы: app.use(middleware) - использовать middleware в цепочке app.all(‘/private’, requireAuthentihication) - использовать middleware для любого запроса по маске app.route(‘/path’).get(getMethod).post (postMethod) или router.use(‘path’, method) - роутинг app.listen(port) - запустить сервер Объекты: app.locals - объект, доступный во всех темлпейтах req - http запрос res - http ответ
  • 10.
    Впечатления 1. Sails.js -слишком высокоуровневый, в реальном приложении можно достаточно быстро попасть в ситуацию, когда его возможностей не будет хватать, а Express внутри себя он уже как-то инкапсулирует. 2. Express.js - фреймворк в самом расцвете лет. Уже есть всё, что надо, и не навешено ничего лишнего. И скорее всего не будет :) 3. Node.js - замечательный инструмент, очень динамично развивается. Подходит для многих задач. Если для ваших задач больше подходят слова JSON и NoSQL, чем транзакции и enterprise, то Node.js будет хорошим выбором.
  • 11.
    2-ступенчатая транзакция tx.query(SQL_APPLY_REQUEST, [code],function(err, res) { if (err) { console.log("Applying request error:" + err); deferred.reject(err); } else if (res.affectedRows !== 1) { tx.rollback(); deferred.reject(new Error('WRONG_CODE')); } else { data.push(res); tx.query(SQL_CREATE_ADMIN, [code], function(err, res) { if (err) { console.log("Creating admin error:" + err); deferred.reject(err); } else { data.push(res); tx.commit(function(err){ if (err) { console.log("Error occurs during creating admin:" + err); deferred.reject(err); } else { var promise = findRequest(code); promise.then(function(data) { notify.process(data, 'request- applied'); }, function(err) { console.log("Cannot retrieve request data from db"); }); deferred.resolve(data); } }); } }); } });
  • 12.
    Спасибо за внимание! 1.Node.js - официальный сайт 2. Express.js - официальный сайт 3. Sails - официальный сайт 4. How do I get started with Node.js? на Stackoverflow 5. Art of Node на GitHub 6. Mixu’s Node Book