Рубрики
Без рубрики

Использование Sequelize ORM с Node.js и Express

Sequelize – это популярная и стабильная ORM, используемая с Node.js. В этой статье мы будем создавать приложение для заметок, которое выполняет операции CRUD против базы данных, используя SEXELIZE.

Автор оригинала: Tom Kadwill.

Вступление

Sequelize Это популярный ORM, созданный для Node.js, и в этом руководстве мы будем использовать его, чтобы построить API Crud для управления заметками.

Взаимодействие с базами данных – это общее задание для приложений Backend. Обычно это было сделано через RAW SQL-запросы, которые могут быть трудно построить, особенно для тех новых для SQL или баз данных в целом.

В конце концов, Объект реляционные материалы (ОРМ) пришли – предназначен для облегчения управляющих баз данных. Они автоматически автоматически отображают объекты (объекты) из нашего кода в реляционной базе данных, поскольку имя подразумевает.

Больше не будем писать необработанные SQL-запросы и выполнить их против базы данных. Предоставляя нам программный способ подключения нашего кода к базе данных и манипулировать сохраняемыми данными, мы можем сосредоточиться больше на бизнес-логике и меньше на фоне ошибок SQL.

Что такое ORM?

Объект реляционного сопоставления Это техника, которая отображает объекты программного обеспечения в таблицы баз данных. Разработчики могут взаимодействовать с объектами вместо того, чтобы фактически написать любые запросы к базе данных. Когда объект будет прочитан, создан, обновляется или удален, конструирует ORM и выполняет запрос базы данных под капотом.

Еще одним преимуществом ORMS является поддержка нескольких баз данных: Postgres , MySQL , SQLite И т. Д. Если вы пишете приложение, используя RAB-запросы, будет трудно переместить в другую базу данных, потому что многие запросы должны будут повторно написаны.

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

Секвентифицировать

Есть много узлов ОРМ, включая популярные Bookshelf.js и Типрм Отказ

Итак, почему и когда выбрать Sequelize?

Во-первых, это было вокруг в течение длительного времени – 2011 год. Имеет тысячи звезд GitHub и используются тоннами приложений. Из-за возраста и популярности он стабилен и имеет много документации, доступную в Интернете.

В дополнение к его погашению и стабильности, Sequelize имеет большой набор функций, которые охватывают: запросы, принципы, отношения, транзакции, сырые вопросы, миграции, репликацию чтения и т. Д.

Обратите внимание на то, что Sequelize – это сохранение, основанное на обещании, что облегчает управление асинхронными функциями и исключениями. Он также поддерживает все популярные диалекты SQL: PostgreSQL, MySQL, Mariadb, SQLite и MSSQL.

С другой стороны, нет поддержки NoSQL, которую можно увидеть в ORMS (или объекте документ Mappers, в этом случае), таких как Мангуст Отказ Действительно, решение того, что ORM выбрать, главным образом на требованиях проекта, над которой вы работаете.

Установка секвенирования

Примечание : Если вы хотите следовать с кодом, вы можете найти его здесь на Github Отказ

Давайте сделаем приложение скелета узла и установить Sequelize. Во-первых, давайте создадим каталог для нашего проекта, введите его и создайте проект с настройками по умолчанию:

$ mkdir notes-app
$ cd notes-app
$ npm init -y

Затем мы создадим файл приложений с помощью базового Express Server и маршрутизатором. Давайте назовем это index.js Чтобы соответствовать имени файла по умолчанию из NPM init :

Далее, чтобы легко создать веб-сервер, который мы установим Express:

$ npm install --save express

И с его установленным, давайте настроим сервер:

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => res.send('Notes App'));

app.listen(port, () => console.log(`notes-app listening on port ${port}!`));

Наконец, мы можем идти вперед и установить Sequelize и нашу базу данных выбора через NPM :

$ npm install --save sequelize
$ npm install --save sqlite3

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

Теперь давайте добавим какой-код к index.js Файл для настройки базы данных и проверьте соединение с помощью Sequelize. В зависимости от которой вы используете базу данных, вам может потребоваться определить другой диалект:

const Sequelize = require('sequelize');
const sequelize = new Sequelize({
  // The `host` parameter is required for other databases
  // host: 'localhost'
  dialect: 'sqlite',
  storage: './database.sqlite'
});

После импорта Sequelize мы устанавливаем его с параметрами, которые необходимо запустить. Вы также можете добавить больше параметров здесь, например Бассейн Хотя то, что нам хватило, достаточно, чтобы начать. Диалект Зависит от того, в какую базу данных вы используете, и хранение Просто указывает на файл базы данных.

База данных .sqlite Файл создается автоматически на корневом уровне нашего проекта.

Примечание: Стоит проверять Sequelize Docs Для настройки различных баз данных и необходимую информацию для каждого.

Если вы используете mysql, postgres, mariadb или mssql вместо прохождения каждого параметра отдельно, вы также можете просто передать URI соединения:

const sequelize = new Sequelize('postgres://user:[email protected]:5432/dbname');

Наконец, давайте проверим соединение, запустив .authentite () метод. Под капотом он просто запускает Выберите Запрос и проверяет, правильно ли база данных отвечает:

sequelize
  .authenticate()
  .then(() => {
    console.log('Connection has been established successfully.');
  })
  .catch(err => {
    console.error('Unable to connect to the database:', err);
  });

Запуск приложения мы встречались с:

$ node index.js
notes-app listening on port 3000!
Executing (default): SELECT 1+1 AS result
Connection has been established successfully.

Создание модели для сопоставления

Прежде чем мы сможем построить API Notes, нам нужно создать таблицу заметки. Для этого нам нужно определить Примечание Модель, которая мы присваиваем постоянной, так что ее можно использовать на нашем API. В Определить Функция Мы указываем имя таблицы и поля. В этом случае текстовое поле для примечания и строки для тега:

Как и в случае с реляционными базами данных, перед созданием API нам нужно сначала создать адекватные таблицы. Поскольку мы хотим избежать создания его вручную, используя SQL, мы определим Модель Класс, а затем выяснить карту его в таблицу.

Это может быть сделано либо расширением Sequelize.model класс и работает .init () Функция, передача параметров или определяя Const и присвоение ему возвращенного значения .define () Метод от секвенирования.

Последнее более лаконичнее, поэтому мы будем идти с этим:

const Note = sequelize.define('notes', { note: Sequelize.TEXT, tag: Sequelize.STRING });

Сопоставление модели в базу данных

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

Хотя, чтобы сохранить ситуацию, мы будем использовать .sync () метод. Что такое .sync () Простое – это синхронизирует все определенные модели в базу данных:

sequelize.sync({ force: true })
  .then(() => {
    console.log(`Database & tables created!`);
  });

Здесь мы использовали сила Флаг и установить его на правда Отказ Если таблица существует уже существует, метод будет Падение это и Создать новенький. Если это не существует, просто создается таблица.

Наконец, давайте создадим приметки, которые мы тогда сохраним в базе данных:

sequelize.sync({ force: true })
  .then(() => {
    console.log(`Database & tables created!`);

    Note.bulkCreate([
      { note: 'pick up some bread after work', tag: 'shopping' },
      { note: 'remember to write up meeting notes', tag: 'work' },
      { note: 'learn how to use node orm', tag: 'work' }
    ]).then(function() {
      return Note.findAll();
    }).then(function(notes) {
      console.log(notes);
    });
  });

Запуск сервера наши заметки напечатаны в консоли, а также операции SQL, выполняемые SEXELIZE. Давайте подключаемся к базе данных для проверки того, что записи действительно были добавлены правильно:

$ sqlite3 database.sqlite
sqlite> select * from notes;
1|pick up some bread after work|shopping|2020-02-21 18:24:19.402 +00:00|2020-02-21 18:24:19.402 +00:00
2|remember to write up meeting notes|work|2020-02-21 18:24:19.402 +00:00|2020-02-21 18:24:19.402 +00:00
3|learn how to use node orm|work|2020-02-21 18:24:19.402 +00:00|2020-02-21 18:24:19.402 +00:00
sqlite> .exit

С базой данных на нашем таблице создан, давайте продолжим и реализуем основную функциональность Crud.

Чтение объектов

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

Прочитайте все объекты

Например, мы можем прочитать все записи этого класса, сохраненного с помощью .findall () метод. Давайте сделаем простую конечную точку, которая обслуживает все сохраненные сущности:

app.get('/notes', function(req, res) {
  Note.findAll().then(notes => res.json(notes));
});

.findall () Метод возвращает массив нот, которые мы можем использовать для рендеринга тела ответа, через res.json Отказ

Давайте проверим конечную точку через Curl :

$ curl http://localhost:3000/notes
[{"id":1,"note":"pick up some bread after work","tag":"shopping","createdAt":"2020-02-27T17:02:10.881Z","updatedAt":"2020-02-27T17:02:10.881Z"},{"id":2,"note":"remember to write up meeting notes","tag":"work","createdAt":"2020-02-27T17:02:10.881Z","updatedAt":"2020-02-27T17:02:10.881Z"},{"id":3,"note":"learn how to use node orm","tag":"work","createdAt":"2020-02-27T17:02:10.881Z","updatedAt":"2020-02-27T17:02:10.881Z"}]

Как видите, все наши записи базы данных были возвращены нам, но в форме JSON.

Хотя, если мы стремимся добавить немного больше возможностей, у нас есть операции по запросу, такие как Выберите , Где , И , Или и Ограничить поддерживается этим методом.

Полный список поддерживаемых методов запроса можно найти на Sequelize Docs страница.

Читать сущности, где

Имея в виду, давайте сделаем конечную точку, которая служит одному, конкретному примечанию:

app.get('/notes/:id', function(req, res) {
  Note.findAll({ where: { id: req.params.id } }).then(notes => res.json(notes));
});

Конечные точки принимают ID Параметр, используемый для поиска записки через Где пункт. Давайте проверим это через Curl :

$ curl http://localhost:3000/notes/2
[{"id":2,"note":"remember to write up meeting notes","tag":"work","createdAt":"2020-02-27T17:03:17.592Z","updatedAt":"2020-02-27T17:03:17.592Z"}]

Примечание : Поскольку этот маршрут использует WildCard Param, : id , это будет соответствовать любой строка, которая приходит после /Notes/ Отказ По этой причине этот маршрут должен быть в конец вашего файла index.js. Это позволяет другим маршрутам, как /Примечания/Поиск , чтобы обработать запрос перед /Примечания/: ID поднимает это. В противном случае Поиск Ключевое слово в пути URL будет рассматриваться как идентификатор.

Читать сущности, где и

Для еще более конкретных запросов давайте сделаем конечную точку, используя оба Где и И заявления:

app.get('/notes/search', function(req, res) {
  Note.findAll({ where: { note: req.query.note, tag: req.query.tag } }).then(notes => res.json(notes));
});

Здесь мы ищем заметки, которые соответствуют как Примечание и Тег указано параметрами. Опять же, давайте проверим это через Curl :

$ curl "http://localhost:3000/notes/search?note=pick%20up%20some%20bread%20after%20work&tag=shopping"
[{"id":1,"note":"pick up some bread after work","tag":"shopping","createdAt":"2020-02-27T17:09:53.964Z","updatedAt":"2020-02-27T17:09:53.964Z"}]

Читать сущности или

Если мы пытаемся быть немного более расплывчатым, мы можем использовать Или Заявление и поиск заметки, которые соответствует любой данных параметров. Изменить /Примечания/Поиск Маршрут на:

const Op = Sequelize.Op;

app.get('/notes/search', function(req, res) {
  Note.findAll({
    where: {
      tag: {
        [Op.or]: [].concat(req.query.tag)
      }
    }
  }).then(notes => res.json(notes));
});

Здесь мы используем Sequelize.op Для реализации Или запрос. Sequelize предоставляет несколько операторов на выбор, как Op.or , Op.and , Op.eq , Op.ne , Op.is , Op.not И т. Д. Они в основном используются для создания более сложных операций, таких как запросы с помощью строки Regex.

Обратите внимание, что мы используем req.cery.tag Как аргумент на .findall () Отказ Sequelize ожидает массива здесь, поэтому мы заставляем Тег быть массивом, использующим [] .Concat () Отказ В нашем тесте ниже мы передадим несколько аргументов в нашем URL-адресе запроса:

$ curl "http://localhost:3000/notes/search?tag=shopping&tag=work"
[{"id":1,"note":"pick up some bread after work","tag":"shopping","createdAt":"2020-02-27T17:11:27.518Z","updatedAt":"2020-02-27T17:11:27.518Z"},{"id":2,"note":"remember to write up meeting notes","tag":"work","createdAt":"2020-02-27T17:11:27.518Z","updatedAt":"2020-02-27T17:11:27.518Z"},{"id":3,"note":"learn how to use node orm","tag":"work","createdAt":"2020-02-27T17:11:27.518Z","updatedAt":"2020-02-27T17:11:27.518Z"}]

При прохождении одного и того же запроса Param несколько раз в таком же времени он будет отображаться как массив в req.chery объект. Так что в приведенном выше примере req.cery.tag это [«Шоппинг», «работа»] Отказ

Читать предельными ограничениями

Последнее, что мы прикроем в этом разделе, это Ограничить Отказ Допустим, мы хотели изменить проницаемое запрос, чтобы вернуть только два результата макс. Мы сделаем это, добавив Ограничить Параметр и назначение его положительное целое число:

const Op = Sequelize.Op;

app.get('/notes/search', function(req, res) {
  Note.findAll({
    limit: 2,
    where: {
      tag: {
        [Op.or]: [].concat(req.query.tag)
      }
    }
  }).then(notes => res.json(notes));
});

Вы можете увидеть полный список функций запроса на Sequelize Docs Отказ

Вставка сущностей

Вставка сущностей – это намного прост, так как на самом деле нет двух способов выполнять эту операцию.

Давайте добавим новую конечную точку для добавления примечаний:

const bodyParser = require('body-parser');
app.use(bodyParser.json());

app.post('/notes', function(req, res) {
  Note.create({ note: req.body.note, tag: req.body.tag }).then(function(note) {
    res.json(note);
  });
});

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

Внутри маршрута мы используем .create () Способ вставить заметку в базу данных на основе прошедших параметров.

Мы можем проверить это с другим Curl запрос:

$ curl -d '{"note":"go the gym","tag":"health"}' -H "Content-Type: application/json" -X POST http://localhost:3000/notes
{"id":4,"note":"go the gym","tag":"health","updatedAt":"2020-02-27T17:13:42.281Z","createdAt":"2020-02-27T17:13:42.281Z"}

Запуск по этому запросу приведет к созданию записки в нашей базе данных и возвращает нам новый объект базы данных.

Обновление объектов

Иногда мы хотели бы обновить уже существующие субъекты. Сделать это, мы полагаемся на .update () Метод на результате .findbypk () Метод:

app.put('/notes/:id', function(req, res) {
  Note.findByPk(req.params.id).then(function(note) {
    note.update({
      note: req.body.note,
      tag: req.body.tag
    }).then((note) => {
      res.json(note);
    });
  });
});

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

Учитывая возвращенную сущность, мы запускаем .update () Метод на самом деле поставить новые значения на месте. Давайте проверим это через Curl :

$ curl -X PUT -H "Content-Type: application/json" -d '{"note":"pick up some milk after work","tag":"shopping"}' http://localhost:3000/notes/1
{"id":1,"note":"pick up some milk after work","tag":"shopping","createdAt":"2020-02-27T17:14:55.621Z","updatedAt":"2020-02-27T17:14:58.230Z"}

Устранение этого запроса обновляет первую ноту с новым контентом и возвращает обновленный объект:

Удаление сущностей

И, наконец, когда мы хотели бы удалить записи из нашей базы данных, мы используем .Destroy () Метод на результате .findbypk () Метод:

app.delete('/notes/:id', function(req, res) {
  Note.findByPk(req.params.id).then(function(note) {
    note.destroy();
  }).then((note) => {
    res.sendStatus(200);
  });
});

Маршрут для .eselete () выглядит похоже на .update () Отказ Мы используем .findbypk () Чтобы найти конкретную ноту от ID. Тогда .Destroy () Способ удаляет примечание из базы данных.

Наконец, 200 ОК Ответ возвращается клиенту.

Заключение

Объект реляционного сопоставления (ORM) – это техника, которая отображает программные объекты в таблицы баз данных. Sequelize – это популярный и стабильный инструмент ORM, используемый рядом с Node.js. В этой статье мы обсуждали, какие ОРМ, как они работают, и каковы некоторые преимущества использования их над написанием сырых запросов.

С этим знанием мы продолжили написать простое приложение Node.js/Express, которое использует Sequelize для сохранения A Примечание Модель в базу данных. Используя унаследованные методы, мы выполнили операции CRUD в базе данных.

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