node.js – Stepan Suvorov Blog https://stepansuvorov.com/blog Release 2.0 Wed, 11 Oct 2017 05:24:44 +0000 en-US hourly 1 https://wordpress.org/?v=6.3.1 Node Frameworks https://stepansuvorov.com/blog/2017/10/node-frameworks/ https://stepansuvorov.com/blog/2017/10/node-frameworks/#comments Sat, 07 Oct 2017 12:55:05 +0000 http://stepansuvorov.com/blog/?p=3458 Continue reading ]]>

just a bookmark for list of frameworks.

Now I’m in process of looking something suitable for our project.

  • Koa2 – too hipster, good for learning
  • express – old but still green
  • loopback – good env and tooling, too much abstraction
  • nestjs – typescript, decorators, very Angular-like one
]]>
https://stepansuvorov.com/blog/2017/10/node-frameworks/feed/ 2
Runkit – Node.js Playground https://stepansuvorov.com/blog/2017/03/runkit-node-js-playground/ https://stepansuvorov.com/blog/2017/03/runkit-node-js-playground/#respond Tue, 28 Mar 2017 20:42:15 +0000 http://stepansuvorov.com/blog/?p=3341

Runkit – your quick playground just with node.js or with some npm modules(like rxjs, md5, etc)

 

]]>
https://stepansuvorov.com/blog/2017/03/runkit-node-js-playground/feed/ 0
localtunnel – show your work to anyone https://stepansuvorov.com/blog/2015/05/localtunnel-show-your-work-to-anyone/ https://stepansuvorov.com/blog/2015/05/localtunnel-show-your-work-to-anyone/#respond Thu, 21 May 2015 20:47:57 +0000 http://stepansuvorov.com/blog/?p=2668 Continue reading ]]> localtunnel – easy way to share your work(local server output) by providing tunnel from your machine to the internet.

All you need to so is run 2 commands:

[shell]
$ npm install -g localtunnel
$ lt –port 8000
[/shell]

And after you’ll get the link to share, something like https://gqgh.localtunnel.me

]]>
https://stepansuvorov.com/blog/2015/05/localtunnel-show-your-work-to-anyone/feed/ 0
faker.js – data generator library https://stepansuvorov.com/blog/2015/05/faker-js-data-generator-library/ https://stepansuvorov.com/blog/2015/05/faker-js-data-generator-library/#respond Wed, 20 May 2015 19:59:25 +0000 http://stepansuvorov.com/blog/?p=2665 faker.js

faker.js – javascript library to generate test/mock data, very simple in use, works for browser and node.js. Check on jsfiddle.

]]>
https://stepansuvorov.com/blog/2015/05/faker-js-data-generator-library/feed/ 0
Разворачиваем базу проекта на JavaScript https://stepansuvorov.com/blog/2014/04/%d1%80%d0%b0%d0%b7%d0%b2%d0%be%d1%80%d0%b0%d1%87%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc-%d0%b1%d0%b0%d0%b7%d1%83-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0-%d0%bd%d0%b0-javascript/ https://stepansuvorov.com/blog/2014/04/%d1%80%d0%b0%d0%b7%d0%b2%d0%be%d1%80%d0%b0%d1%87%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc-%d0%b1%d0%b0%d0%b7%d1%83-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0-%d0%bd%d0%b0-javascript/#comments Wed, 09 Apr 2014 19:59:28 +0000 http://stepansuvorov.com/blog/?p=1607 Continue reading ]]> Растут JavaScript проекты и соответственно становятся лучше инструменты сборки. Самое время задуматься о разворачивании базы своего проекта на JavaScript. А ведь и правда: если проект написан 100% на одной технологии (да, и сервер тоже), зачем думать о другой технологии для разворачивания базы?

Вот с такими мыслями я и начал исследовать данный вопрос с целью найти удобное решение для своего пэт-проектика (стек: JavaScript/AngularJs – JavaScript/Express – MySql). JavaScript сообщество (а точнее Андрей Листочкин), посоветовало обратить внимание на модуль для ноды db-migrate и плагин для гранта grunt-db-migrate. Пост является набором заметок по ходу внедрения модуля в проект.

На данный момент db-migrate поддерживает Mysql,  PostgreSQLsqlite3. Поэтому, если вы хотите мигрировать другую базу – придется либо писать самому скрипт миграции либо использовать другое решение.

Установка

Устанавливаем модуль ноды и плагин гранта:

$ npm install db-migrate
$ npm install grunt-db-migrate

Настраиваем grunt

В grunt файле добавляем блок:

[javascript]migrate:{
options:{
env: {
DATABASE_URL: databaseUrl
}
}
}[/javascript]

databaseUrl – строка подключения к базе, например:

[javascript]
databaseUrl = ‘mysql://root:@localhost/mypetdb’;
[/javascript]

Создаем файл миграции

Чтобы создать файл миграции(с шаблоном внутри) выполняем команду:

$ grunt migrate:create:migrate_name

После чего у нас в проекте появится директория “migrations”, и файл в ней с таким содержимым:

[javascript]var dbm = require(‘db-migrate’);
var type = dbm.dataType;

exports.up = function(db, callback) {

};

exports.down = function(db, callback) {

};[/javascript]

exports.up – инструкции для наката изменений, export.down – соответственно для отката сделанных изменений.

Разберем пример предложенный на офсайте:

[javascript]
exports.up = function (db, callback) {
db.createTable(‘pets’, {
id: { type: ‘int’, primaryKey: true },
name: ‘string’
}, callback);
};

exports.down = function (db, callback) {
db.dropTable(‘pets’, callback);
};
[/javascript]

Вроде бы все просто: db.createTable() – добавляем таблицу, db.dropTable() – удаляем.

Свойства, который можно определять для полей:

  • type – тип данный, полный список поддерживаемых типов тут
  • length – размерность (там где поддерживается)
  • primaryKey [true/false]
  • autoIncrement [true/false]
  • notNull [true/false]
  • unique [true/false]
  • defaultValue

Список поддерживаемых методов:

  • createTable(tableName, columnSpec, callback)
  • dropTable(tableName, [options,] callback)
  • renameTable(tableName, newTableName, callback)
  • addColumn(tableName, columnName, columnSpec, callback)
  • removeColumn(tableName, columnName, callback)
  • renameColumn(tableName, oldColumnName, newColumnName, callback)
  • changeColumn(tableName, columnName, columnSpec, callback)
  • addIndex(tableName, indexName, columns, [unique], callback)
  • insert(tableName, columnNameArray, valueArray, callback)
  • removeIndex([tableName], indexName, callback)
  • runSql(sql, [params,] callback)
  • all(sql, [params,] callback)

Запуск

Теперь grunt может выполнить задачу:

$ grunt migrate:up

и чтобы откатить изменения:

$ grunt migrate:down

создать новый файл миграции:

$ grunt migrate:create:migration_name

Дополнительно

Когда нам нужно создать несколько таблиц, удобно использовать модуль async:

[javascript]
var async = require(‘async’);

exports.up = function (db, callback) {
async.series([
db.createTable.bind(db, ‘pets’, {
id: { type: ‘int’, primaryKey: true },
name: ‘string’
}),
db.createTable.bind(db, ‘owners’, {
id: { type: ‘int’, primaryKey: true },
name: ‘string’
});
], callback);
};
[/javascript]

метод async.series позволит избежать вложенности

Пример из реальной жизни

Вот файл миграции, который я создал для своего пет-проектика:

[javascript]
var dbm = require(‘db-migrate’);
var async = require(‘async’);

exports.up = function (db, callback) {
async.series([
db.createTable.bind(db, ‘marks’, {
user_id: {
type: ‘int’,
notNull: true
},
release_id: {
type: ‘int’,
notNull: true
},
feed: {
type:’string’,
notNull: true
}
})
], function(){
db.addIndex(‘marks’, ‘usermark’, [‘user_id’, ‘release_id’], true);
callback();
});
};

exports.down = function (db, callback) {
async.series([
db.dropTable.bind(db, ‘marks’, {
ifExists: true
}),
db.removeIndex(‘marks’, ‘usermark’),
], callback);
};
[/javascript]

Проект портировался с локальной mysql базы на postgress, которая стояла на сервере. Особых косяков модуля db-migrate замечено не было. Можно отметить только мелкие неудобства, которых характерны для любых универсальных (кросс-субд) систем миграции – отсутствие реализации специфических типов: у меня изначально был тип ENUM, который пришлось перевести в STRING. Для личного проекта это нормальная замена, но для продакшена пришлось бы писать отдельный дополнительный конвертер.

Более подробно можно почитать на офсайте либо покопать код.

]]>
https://stepansuvorov.com/blog/2014/04/%d1%80%d0%b0%d0%b7%d0%b2%d0%be%d1%80%d0%b0%d1%87%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc-%d0%b1%d0%b0%d0%b7%d1%83-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0-%d0%bd%d0%b0-javascript/feed/ 1
Passport.js авторизация для node.js https://stepansuvorov.com/blog/2014/03/passport-js/ https://stepansuvorov.com/blog/2014/03/passport-js/#respond Tue, 25 Mar 2014 21:03:02 +0000 http://stepansuvorov.com/blog/?p=1609

Внезапно для себя обнаружил опенсорс проект Passport.js — это middleware для авторизации под node.js. Которое позволяет “из коробки” авторизироваться в большинстве современных онлайн сервисов (на данным момент больше 140 различных стратегий: такие как Facebook, Twitter, Github).

]]>
https://stepansuvorov.com/blog/2014/03/passport-js/feed/ 0
Песочница для mongodb https://stepansuvorov.com/blog/2012/11/%d0%bf%d0%b5%d1%81%d0%be%d1%87%d0%bd%d0%b8%d1%86%d0%b0-%d0%b4%d0%bb%d1%8f-mongodb/ https://stepansuvorov.com/blog/2012/11/%d0%bf%d0%b5%d1%81%d0%be%d1%87%d0%bd%d0%b8%d1%86%d0%b0-%d0%b4%d0%bb%d1%8f-mongodb/#comments Sat, 10 Nov 2012 20:21:22 +0000 http://stepansuvorov.com/blog/?p=728 Continue reading ]]> Проходя курсы по mongoDb остро стала необходимость в организации какой-то песочницы для скриптов, так как просто в mongoshell писать стало не удобно, а отдельно писать в редакторе код, а потом его запускать через консоль – тоже не интересно.

Покопавшись в плагинах WebStorm (который является моим текущим IDE), я обнаружил, что для mongoDb расширения, увы, еще нет. Ну что же, играем дальше. Есть плагин на node.js, который довольно просто настраивается. После чего можем в настройках запуска проекта

добавить вариант запуска текущего скрипта нодой.

Надеюсь, вы не забыли поставить монго драйвер на ноду.

Итак, у нас есть удобный редактор, подключенная нода и консольный вывод в самом редакторе. Осталось только накидать код:

var mongo = require('mongodb');
var host = 'localhost';
var port = mongo.Connection.DEFAULT_PORT;

var db = new mongo.Db('test', new mongo.Server(host, port, {}), {safe:false});
db.open(function(err, db) {
    console.log("Connected!");

    // а вот тут и пишем наш код, который хотим отладить

    db.close();
});

Happy codding!

]]>
https://stepansuvorov.com/blog/2012/11/%d0%bf%d0%b5%d1%81%d0%be%d1%87%d0%bd%d0%b8%d1%86%d0%b0-%d0%b4%d0%bb%d1%8f-mongodb/feed/ 1
Сборка javascript проектов с помощью Grunt https://stepansuvorov.com/blog/2012/10/%d1%81%d0%b1%d0%be%d1%80%d0%ba%d0%b0-javascript-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%be%d0%b2-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-grunt/ https://stepansuvorov.com/blog/2012/10/%d1%81%d0%b1%d0%be%d1%80%d0%ba%d0%b0-javascript-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%be%d0%b2-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-grunt/#comments Tue, 30 Oct 2012 13:53:03 +0000 http://stepansuvorov.com/blog/?p=711 Continue reading ]]>

Grunt – инструмент для сборки JavaScript проектов из командной строки. Молодой (зарелизился в январе 2012) и активно развивающийся(на данный момент для него написано уже 188 плагинов).

Благодаря тому, что grunt имеет готовый npm-пакет для node.js,  установка очень простая:

$ npm install grunt -g

Ставим grunt глобально, после чего нам доступна команда из консоли:

$ grunt --version
grunt v0.3.17

Далее необходимо инициализировать проект, для этого у нас есть команда grunt init:TEMPLATE, где TEMPLATE – один из шаблонов:

  • commonjs
  • jquery
  • node
  • gruntfile – только главный файл
  • gruntplugin

Перейдем в директорию где мы хотим создать grunt проект и выполним:

$ grunt init:jquery

после чего должно выдать серию вопросов о проекте(title, description, git-url…). После успешного прохождения этого квеста в выбранной директории появятся файлы сборщика.

Установим также PhantomJs, наличие которого предполагает grunt.

После чего можем смело запускать сборщик на выполнение:

$ grunt
Running "lint:files" (lint) task
Lint free.

Running "qunit:files" (qunit) task
Testing testproject.html....OK
>> 4 assertions passed (23ms)

Running "concat:dist" (concat) task
File "dist/testproject.js" created.

Running "min:dist" (min) task
File "dist/testproject.min.js" created.
Uncompressed size: 467 bytes.
Compressed size: 229 bytes gzipped (324 bytes minified).

Done, without errors.

– вот так вот он работает: проверил код(JSHint), запустил тесты(QUnit), соединил и сжал  файлы.

Чтобы рассмотреть инструкции по конфигурированию сборщика, проинициализируем новый проект:

$ grunt init:gruntfile

Он создаст только заготовку для главного файла(grunt.js). Откроем ее и посмотрим что внутри.

Начнем разбор с конца файла:

grunt.registerTask('default', 'lint qunit concat min');

Эта строчка говорит grunt какие задачи будут выполнены по умолчанию(т.е. запустив команду без параметров). Тут мы можем добавить свои варианты:

grunt.registerTask('prod', 'lint qunit concat min');
grunt.registerTask('test', 'lint qunit');

Возможные варианты заданий:

  • concat – конкатенация файлов
  • init – Generate project scaffolding from a predefined template.
  • lint – валидация файлов с помощью  JSHint.
  • min – сжатие файлов с UglifyJS.
  • qunit – Запуск QUnit юнит тестов на PhantomJS.
  • server – запускает статический веб сервер.
  • test – запуск юнит тестов на nodeunit.
  • watch – запуск заранее определенных заданий, для файлов из списка.

Ну а теперь последовательно по секциям конфига(по сути конфигурация для каждого задания):

meta - описание проекта, вспомогательная информация
lint/qunit/test/concat/min - список фалов, 
которые нужно отвалидировать(JSHint)/протестировать(qUnit)/протестировать(nodeUnit)/объединить/сжать(UglifyJS)
watch - список файлов и команды, которые необходимо выполнить, в случае изменения содержания файла
jshint - конфигурация JSHint
uglify - специфические настройки UglifyJS
server - пока не понятно зачем

Для каждой опции, где мы указываем список файлов существуют 2 подсекции: files и src. По умолчанию задание выполняется с командой files, но если мы хоти выполнить со списком файлов src, тогда стоит уточнить:

grunt.registerTask('build_src', 'lint:src qunit:src concat:src min:src');

Если встроенных заданий не хватает, можно писать свои и мотом подключать их с помощью методов:

grunt.loadTasks(ПУТЬ_К_ДИРЕКТОРИИ_С_ЗАДАНИЕМ);
grunt.loadNpmTasks(ИМЯ_ПЛАГИНА);

– второй вариант для дополнительных задач установленных через npm. Вот хорошая страничка, на которой перечислены самые распространенные варианты. Попробуем поставить requirejs:

npm install grunt-contrib-requirejs

и подключим в файл конфигурации:

grunt.loadNpmTasks("requirejs");

Внимание! тут есть специфика: модули установленные через npm будут подхватываться только если установлены в директорию c grunt. Подробно проблема описана вот тут.

Из основного это все.

]]>
https://stepansuvorov.com/blog/2012/10/%d1%81%d0%b1%d0%be%d1%80%d0%ba%d0%b0-javascript-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%be%d0%b2-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-grunt/feed/ 3
Node.js и MongoDB https://stepansuvorov.com/blog/2012/10/node-js-%d0%b8-mongodb/ https://stepansuvorov.com/blog/2012/10/node-js-%d0%b8-mongodb/#comments Tue, 16 Oct 2012 06:41:24 +0000 http://stepansuvorov.com/blog/?p=677 Continue reading ]]>

Попробуем подружить MongoDB и Node.js.

Договоримся что нода у нас уже стоит, если нет идем по тегу Node.js, и разбираемся, а потом возвращаемся сюда доставлять mongoDB.

Чтобы поставить MongoDB на Ubuntu(12.04) выполняем следующую команду:

$ apt-get install mongodb

Чтобы проверить правильно ли поставилось запускаем:

$ /usr/bin/mongo

Должно зайти в программу и выдать что-то типа:

MongoDB shell version: 2.0.4
connecting to: test

Далее устанавливаем дополнительный пакет на ноду:

$ npm install mongodb

если мы будем использовать во всех проектах монго, то имеет смысл поставить флажок -g “для всех”:

$ npm install mongodb -g

!Внимание. Предварительно может потребовать установить пакет node-gyp.

$ npm install node-gyp -g

Есть. Проверим через простой скрипт test.js установился ли модуль, содержание:

var mongo = require('mongodb');

Выполняем:

$ node test.js

Если ошибок не выдало, можно еще немного расширить наш скрипт:

var mongo = require('mongodb');
var host = 'localhost';
var port = mongo.Connection.DEFAULT_PORT;

var db = new mongo.Db('test', new mongo.Server(host, port, {}), {safe:false});
db.open(function(err, db) {
    console.log("Connected!");
    db.close();
});

– создали объект базы, подключились к базе, закрыли соединение.

Немного расширим наш скрипт, добавим запись и чтение информации из базы:

...
var db = new mongo.Db('test', new mongo.Server(host, port,{}), {safe:false});
db.open(function(err, db) {
    console.log("Connected!");

    var collection = db.collection("simple_collection");
    collection.insert({hello:'world'});

    collection.findOne({hello:'world'}, function(err, item) {
        console.log(item);
        db.close();
    })

});

Чтобы добавить несколько записей можно сделать так:

collection.insert([{hello:'world'}, {hello:'world2'}, {hello:'world3'}]);

Думаю будет еще один пост непосредственно о использовании MongoDB, а в этом пока все.

]]>
https://stepansuvorov.com/blog/2012/10/node-js-%d0%b8-mongodb/feed/ 1
Делаем HTTPS на Node.js используя express https://stepansuvorov.com/blog/2012/09/%d0%b4%d0%b5%d0%bb%d0%b0%d0%b5%d0%bc-https-%d0%bd%d0%b0-node-js-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d1%8f-express/ https://stepansuvorov.com/blog/2012/09/%d0%b4%d0%b5%d0%bb%d0%b0%d0%b5%d0%bc-https-%d0%bd%d0%b0-node-js-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d1%8f-express/#comments Thu, 27 Sep 2012 18:27:38 +0000 http://stepansuvorov.com/blog/?p=650 Continue reading ]]> Такая вот быстрая заметка по организации HTTPS(SSL) соединения на ноде через фреймворк, чего не нашел в официальной документации express.

Модули которые необходимо подключить:

var express = require('express');  // сам фреймворк
var https = require( "https" );  // для организации https
var fs = require( "fs" );   // для чтения ключевых файлов

Задать опции ключевой информации:

httpsOptions = {
    key: fs.readFileSync("server.key"), // путь к ключу
    cert: fs.readFileSync("server.crt") // путь к сертификату
}

Открыть порт

https.createServer(httpsOptions, app).listen(443);

*app – это объект полученый от express().

]]>
https://stepansuvorov.com/blog/2012/09/%d0%b4%d0%b5%d0%bb%d0%b0%d0%b5%d0%bc-https-%d0%bd%d0%b0-node-js-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d1%8f-express/feed/ 2