Введение в Bookshelf.js

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

В результате люди начали использовать back end разработку с помощью Node. Одна из самых важных вещей back end системы эффективное взаимодействие с базой данных. Для этого используется ORM( объектно-реляционного отображение). ORM упрощает разработку, позволяет программисту взаимодействовать с базой данных используя объекты. В этой статье мы рассмотрим ORM библиотеку для Node.js — Bookshelf.js.

Что такое ORM?

Википедия определяет объектно-реляционного отображение как:

технология программирования, которая связывает для преобразования данных несовместимые типы систем: базу данных и данные объектно-ориентированного языка программирования, создавая «виртуальную объектную базу данных», которую можно использоваться внутри языка программирования

В нашем случае, язык программирования JavaScript, и несовместимая система является реляционная база данных, такая как MySQL. Это означает, что ORM библиотека должна позволить нам взаимодействовать с базами данных таким же образом как мы взаимодействуем с обычными объектами в JavaScript. Есть много библиотек ORM, которые существуют для Node.js, наиболее популярные из них: Persistence.js, Sequelize.js и Bookshelf.js. Здесь мы рассмотрим Bookshelf.js.

Примеры использования Bookshelf.js

Взаимодействие базой данных, как правило, сосредоточены вокруг четырех операций CRUD — создание, чтение, обновление и удаление. Bookshelf.js обеспечивает интуитивный способ этого взаимодействия. Пример создания выглядит следующим образом:

new Post({name: 'New Article'}).save().then(function(model) {
  // ...
});

Здесь Post является моделью, которая имеет соответствующую таблицу базы данных а name является атрибутом, который соответствует полю в таблице базы данных.

Операция чтения выглядит следующим образом:

// select * from `user` where `email` = 'user@mail.com'
new User({email: 'user@mail.com'})
  .fetch()
  .then(function(model) {
    console.log(model.get('gender'));
  });

Обратите внимание на вызов then в коде. Bookshelf.js поддерживает интерфейсы основ взаимодействия, которые в данном случае означают, что анонимная функция будет вызван только если наш запрос был успешным. model является результирующим объектом JavaScript, который можно использовать для доступа к атрибутам User. В нашем случае model.get (‘gender’) возвращает пол нашего пользователя.

Разработка с Bookshelf.js и Express.js

Для более полного примера, предположим, что мы должны построить API JSON для блога со следующими методами:

GET  /api/article
GET  /api/article/:article_id
POST /api/article

У нас есть база данных MySQL со следующими параметрами:

create table article (
  id int not null primary key,
  title varchar(100) null,
  body text null,
  author varchar(100) null
);

Для начала, нам нужно настроить наш Express.js среду с package.json:

{
  "name": "article_api",
  "description": "expose articles via JSON",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "bluebird": "^2.1.3",
    "body-parser": "^1.3.1",
    "express": "4.4.3",
    "mysql": "*",
    "knex": "*",
    "bookshelf": "*"
  }
}

Для bookshelf нам нужны knex, построитель запросов, и bluebird. Наша структура app.js теперь выглядит следующим образом:

// При запуске приложение
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var Promise = require('bluebird');
var dbConfig = {
  client: 'mysql',
  connection: {
    host: 'localhost',
    user: 'root',
    password: 'your_password',
    database: 'blog',
    charset: 'utf8'
  }
};
var knex = require('knex')(dbConfig);
var bookshelf = require('bookshelf')(knex);
app.set('bookshelf', bookshelf);
var allowCrossDomain = function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  next();
};
app.use(allowCrossDomain);
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded());
// parse application/json
app.use(bodyParser.json());
// parse application/vnd.api+json as json
app.use(bodyParser.json({type: 'application/vnd.api+json'}));
// для использования bookshelf клиента в другом месте
var bookshelf = app.get('bookshelf');
// {код определения нашей модели}
app.listen(3000, function() {
  console.log('Express started at port 3000');
});

Наша база данных MySQL называется blog. Нам необходимо определить модель Article и связать ее с таблицей article. Мы заменим // {код определения нашей модели} на:

var Article = bookshelf.Model.extend({
  tableName: 'article'
});

Вот и все, что нужно для определения модели в Bookshelf.js. Теперь мы можем использовать эту модель для запросов к базе данных в нашем API. Начнем с метода GET /api/article, должна вернуть все статьи в базе данных:

app.get('/api/article', function(req, res) {
  new Article().fetchAll()
    .then(function(articles) {
      res.send(articles.toJSON());
    }).catch(function(error) {
      console.log(error);
      res.send('An error occured');
    });
});

fetchAll в Bookshelf.js извлекает все записи в таблице базы данных, и catch выполняется только в случае возникновения ошибки.

Вывод

Node.js развивается как технология и может быть использована для создания веб-приложений и интерфейса API с помощью модулей, таких как Bookshelf.js для облегчения взаимодействия с реляционной базой данных.