You are currently viewing Node.js SQLite: Создайте простой REST API с помощью Express step-by-step

Node.js SQLite: Создайте простой REST API с помощью Express step-by-step

Node.js может очень хорошо использоваться с реляционными базами данных, и SQLite не является исключением. В этом посте мы создадим простой REST API для котировок шаг за шагом с помощью SQLite и Node.js пошаговое использование платформы Express Js.

Содержание

Предпосылки

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

  1. У вас есть общие рабочие знания о Node.js и Выразите Js.
  2. У вас есть Node.js (предпочтительно последняя версия LTS), работающая на вашем компьютере или на докере с Node.js бег
  3. SQLite установлен и запущен в вашей системе, вы можете получить его отсюда и попробовать sqlite3 --version после установки.
  4. Любой предыдущий опыт работы с базой данных SQLite был бы полезен, но не является существенным.
  5. Было бы неплохо иметь некоторый опыт работы с git.

На следующей остановке этого Node.js Учебник по SQLite, мы настроим базу данных.

SQLite и Node.js

Нет никаких сомнений в том, что SQLite является наиболее развернутой и используемой базойданных, она есть на каждом мобильном телефоне, на каждом компьютере Mac и Windows 10 в дополнение к бесчисленным миллионам других приложений. В отличие от других реляционных баз данных, у которых есть сервер, к которому подключаются клиенты, например MySQL или PostgreSQL, SQLite является автономной базой данных. Он работает как отдельный файл, но по-прежнему содержит большой список функций. SQLite сверхнадежен и быстр. Он был разработан для автономной работы на линкоре.

Если SQLite на самом деле не является реляционной базой данных клиент-серверной архитектуры, будет ли какой-либо вариант использования Node.js с ним? Да, их много, например, если мы создадим автономное приложение, которому нужна реляционная база данных, единственным выбором будет SQLite. Некоторые люди даже проводят интеграционные или сквозные тесты на SQLite, где основной базой данных приложения является клиент-серверная база данных. Обычно для такого рода плавного обмена базами данных используется объектно-реляционный картограф (ORM). Другим вариантом использования может быть, если мы создаем электронное приложение и нам нужна база данных для поддержки любых действий в автономном режиме. SQLite можно даже использовать в качестве временного хранилища, чтобы разблокировать пользователя для выполнения действия в автономном режиме, которое позже может быть синхронизировано с другим API/базой данных, когда устройство снова подключится к сети. Для этой демонстрации может быть много других применений, мы создадим простой API котировок.

Настройка базы данных SQLite с таблицей котировок

Мы создадим API котировок с использованием SQLite в качестве нашей базы данных по выбору. Для этого мы сначала создадим базу данных SQLite с:Копировать

mkdir nodejs-sqlite
cd nodjs-sqlite
sqlite3 quotes.db

Сначала мы создаем папку под названиемnodejs-sqlite, а затем заходим в нее. После этого мы создали базу данных с sqlite3помощью команды. Это даст нам запрос SQLite, как показано ниже:

Мы можем создать таблицу “котировки” со следующим SQL:Копировать

CREATE TABLE quote (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  quote text NOT NULL UNIQUE,
  author text NOT NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL
);

После создания quote таблицы мы вставим некоторые цитаты для последующего тестирования, выполнив SQL-запрос, как показано ниже.

INSERT INTO quote (quote, author) VALUES 
('There are only two kinds of languages: the ones people complain about and the ones nobody uses.', 'Bjarne Stroustrup'), 
('Any fool can write code that a computer can understand. Good programmers write code that humans can understand.', 'Martin Fowler'), 
('First, solve the problem. Then, write the code.', 'John Johnson'), 
('Java is to JavaScript what car is to Carpet.', 'Chris Heilmann'), 
('Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.', 'John Woods'), 
('I''m not a great programmer; I''m just a good programmer with great habits.', 'Kent Beck'), 
('Truth can only be found in one place: the code.', 'Robert C. Martin'), 
('If you have to spend effort looking at a fragment of code and figuring out what it''s doing, then you should extract it into a function and name the function after the "what".', 'Martin Fowler'), 
('The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at the wrong times; premature optimization is the root of all evil (or at least most of it) in programming.', 'Donald Knuth'), 
('SQL, Lisp, and Haskell are the only programming languages that I’ve seen where one spends more time thinking than typing.', 'Philip Greenspun'), 
('Deleted code is debugged code.', 'Jeff Sickel'), 
('There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.', 'C.A.R. Hoare'), 
('Simplicity is prerequisite for reliability.', 'Edsger W. Dijkstra'), 
('There are only two hard things in Computer Science: cache invalidation and naming things.', 'Phil Karlton'), 
('Measuring programming progress by lines of code is like measuring aircraft building progress by weight.', 'Bill Gates'), 
('Controlling complexity is the essence of computer programming.', 'Brian Kernighan'),
('The only way to learn a new programming language is by writing programs in it.', 'Dennis Ritchie');

После вставки 17 строк, если мы запустим” ВЫБРАТЬ * ИЗ цитаты», мы увидим следующий вывод:

Далее мы установим Express.js чтобы показать цитаты, извлеченные из только что созданной базы данных.

Экспресс-настройка с улучшенным SQLite 3

Существует несколько способов настройки Express js, мы будем использовать NPM для настройки express. Чтобы настроить express, мы выполним следующие команды в том же каталоге, в котором quotes.db находится файл:Копировать

npm init -y
npm install express better-sqlite3

Первая команда настроит проект npm с настройками по умолчанию. Он также создаст файл package.json. Вторая команда установит пакеты NPM “express” и “better-sqlite3”, которые нам нужны для создания нашего API котировок.

Получите API котировок с разбиением на страницы

Чтобы добавить API получения котировок, мы добавим index.js файл в корневой каталог проекта, кроме package.json того, он будет содержать следующее содержимое.

const express = require('express');
const app = express();
const port = 3000 || process.env.PORT;
const quotesRouter = require('./routes/quotes');

app.get('/', (req, res) => {
  res.json({message: 'alive'});
});

app.use('/quotes', quotesRouter);

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

Выше index.js будет наш сервер с Express для этого Node.js Демонстрационный урок по SQLite. В этом файле нам требуется express и мы настраиваем его с помощью 2 маршрутов, корень / просто отправляет обратно живое сообщение. Это больше похоже на проверку работоспособности/пинг приложения.

Следовательно, мы настраиваем /quotes маршрут, который обрабатывается файлом маршрутизатора quotes, определенным в /routes/quotes описании далее. После этого мы прослушиваем порт и запускаем сервер.

Затем мы добавим файл routes/quotes.js, на который есть ссылка /index.js, со следующим содержимым.

const express = require('express');
const router = express.Router();
const quotes = require('../services/quotes');

/* GET quotes listing. */
router.get('/', function(req, res, next) {
  try {
    res.json(quotes.getMultiple(req.query.page));
  } catch(err) {
    console.error(`Error while getting quotes `, err.message);
    next(err);
  }
});

module.exports = router;

В этом /routes/quotes.js файле мы создаем новый экспресс-маршрутизатор и добавляем /маршрут get, который будет прослушивать /quotes маршрут. Мы делаем попытку-перехватываем и вызываем следующее промежуточное программное обеспечение, если есть ошибка.

Для этого также требуется /services/quotes.js файл, из которого мы вызываем getMultiple функцию, чтобы получить несколько кавычек, передающих страницу из параметра запроса, который будет проанализирован как /quotes?page=1 из строки запроса.

Далее мы создадим сервис котировок, в /services/quotes.js котором будут содержаться следующие вещи:Копировать

const db = require('../services/db');
const config = require('../config');

function getMultiple(page = 1) {
  const offset = (page - 1) * config.listPerPage;
  const data = db.query(`SELECT * FROM quote LIMIT ?,?`, [offset, config.listPerPage]);
  const meta = {page};

  return {
    data,
    meta
  }
}

module.exports = {
  getMultiple
}

В этом файле нам требуются два других файла, первый из /services/db.js которых будет точкой входа в базу данных, которая будет выполнять запросы к базе данных. Следующий-это тот, в /config.js котором есть параметры конфигурации, такие как количество строк, которые мы хотим отображать на странице, введенной как listPerPage.

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

После этого мы создадим ссылку /services/db.js со следующим содержанием.

const sqlite = require('better-sqlite3');
const path = require('path');
const db = new sqlite(path.resolve('quotes.db'), {fileMustExist: true});

function query(sql, params) {
  return db.prepare(sql).all(params);
}

module.exports = {
  query
}

Этот /services.db.js файл является единственным файлом, который взаимодействует с базой данных SQLite. В нем указан полный путь к файлу базы quotes.db данных, и мы также требуем и используем better-sqlite3 пакет NPM для выполнения наших SQL-запросов.

В этом файле есть только одна функция query, которая использует функцию подготовки из нашей библиотеки по выбору. Функция prepare создает подготовленный оператор. Используя метод all с подготовленным оператором, он возвращает все строки, которые были повторены после выполнения запроса. В нашем случае со смещением и ограничением он вернет максимум 10 строк.

Служба котировок также требовала config.js файл в корне проекта, и он будет иметь следующий код:Копировать

const env = process.env;

const config = {
  listPerPage: env.LIST_PER_PAGE || 10,
}

module.exports = config;

Это /config.js похоже на вспомогательный файл, используемый для хранения любой конфигурации или учетных данных. Для этого Node.js Пример SQLite, мы храним только конфигурацию списка на странице, которая либо взята из переменной среды, либо, если она недоступна, возвращается к значению 10.

После добавления всех этих файлов, если мы запустим сервер с помощью команды node или nodemon, например:Копировать

node index.js

Мы можем увидеть следующий вывод в браузере, когда нажмем http://localhost:3000

Итак, то, что произошло здесь, — это запрос GET для получения нескольких котировок, отправленных следующим образом:

И он извлек данные из quotes.db базы данных SQLite и вернул их обратно в браузер. Поскольку разбиение на страницы также настроено, мы можем попробовать https://localhost:3000/quotes?page=2, что даст нам 7 кавычек с идентификатором от 11 до 17, если мы попробуем страницу 3, она вернет пустой массив данных, так как в базе данных SQLite всего 17 кавычек. Весь код, добавленный для этого шага, можно рассматривать как запрос на извлечение для вашей справки.

В следующем разделе мы добавим API публикации котировок, который позволит нам создать новую котировку.

Опубликуйте API для сохранения новой цитаты с помощью Node.js SQLite

Чтобы добавить новую цитату, мы создадим API для публикации цитат для этого Node.js Учебник по SQLite. Перед этим нам нужно убедиться, что Express может принимать JSON в теле. Чтобы включить Express js, принимающий JSON в теле запроса, нам нужно будет добавить следующую строку после инициализации приложения Express в /index.js файле.Копировать

app.use(express.json());

Ниже этой строки будут размещены наши маршруты. Следовательно, мы добавим маршрут отправки предложения в /routes/quotes.js файл следующим образом:Копировать

/* POST quote */
router.post('/', function(req, res, next) {
  try {
    res.json(quotes.create(req.body));
  } catch(err) {
    console.error(`Error while adding quotes `, err.message);
    next(err);
  }
});

Здесь мы добавили новый маршрут для публикации котировок. Он вызывает метод create в службе котировок и отправляет ответ обратно в формате JSON. Если при создании новой цитаты на SQLite с помощью Nodejs возникнет какая-либо ошибка, она зарегистрирует ошибку и вызовет next промежуточное программное обеспечение.

Впоследствии мы добавим функцию создания /services/quotes.js, как показано ниже:Копировать

function validateCreate(quote) {
  let messages = [];

  console.log(quote);

  if (!quote) {
    messages.push('No object is provided');
  }

  if (!quote.quote) {
    messages.push('Quote is empty');
  }

  if (!quote.author) {
    messages.push('Author is empty');
  }
  
  if (messages.length) {
    let error = new Error(messages.join());
    error.statusCode = 400;

    throw error;
  }
}

function create(quoteObj) {
  validateCreate(quoteObj);
  const {quote, author} = quoteObj;
  const result = db.run('INSERT INTO quote (quote, author) VALUES (@quote, @author)', {quote, author});
  
  let message = 'Error in creating quote';
  if (result.changes) {
    message = 'Quote created successfully';
  }

  return {message};
}

В приведенном выше фрагменте кода мы добавили 2 метода validateCreate и create в службу котировок. Этот метод создания запускает запрос вставки для добавления новой цитаты в базу данных после прохождения проверки. В методе проверки мы проверяем, существуют ли цитата и автор, если какой-либо из них отсутствует, возвращается ошибка с кодом состояния HTTP 400. В более реальном приложении пакет Joi NPM можно использовать для лучшей проверки.

Обратите внимание, что мы назвали db.run функцию не db.query так, как в вызове get quotes. Мы добавим эту run функцию в /services/db.js файл, как показано ниже.

function run(sql, params) {
  return db.prepare(sql).run(params);
}

Как run функция in /sevices/db.js, так и create функция in /services/quotes.js должны быть представлены, будучи включенными в module.exports определение.

После этого, учитывая, что наш сервер запущен, мы можем выполнить следующую команду cURL для вставки нового кода:Копировать

curl -i -X POST -H 'Accept: application/json' \
    -H 'Content-type: application/json' http://localhost:3000/quotes \
    --data '{"quote":"Before software can be reusable it first has to be usable.","author":"Ralph Johnson"}'

Это приведет к следующему результату:Копировать

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 40
ETag: W/"28-Gw37o554emBLJSQVDFBkjoN6exA"
Date: Wed, 27 Oct 2021 11:17:29 GMT
Connection: keep-alive
Keep-Alive: timeout=5

{"message":"Quote created successfully"}

Ура! Наш API добавления котировок также работает. Весь код для введения API POST для добавления нового предложения можно увидеть в этом запросе на вытягивание.

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

Для вашей собственной практики вы можете добавить обновление (PUT) и удалить конечные точки, чтобы лучше понять, как использовать полноценный CRUD API.

Быстрый запуск TLDR

Весь код для этого руководства доступен в общедоступном репозитории GitHub для вашей справки. Чтобы быстро приступить к созданию, пожалуйста, выполните следующие действия:

  1. Клонируйте репозиторий с помощью git clone git@github.com:geshan/nodejs-sqlite.git
  2. Затем выполните cd nodejs-sqlite
  3. После этого беги: npm install && npm start
  4. Впоследствии нажмите http://loalhost:3000/quote на свой любимый браузер
  5. Вы должны увидеть следующее:

Вывод

В этом уроке о Node.js и SQLite, мы узнали, как создать минимальный REST API для котировок. Это больше похоже на отправную точку для создания более масштабных вещей.

Вы можете использовать репозиторий Github с открытым исходным кодом, чтобы использовать этот пример в качестве основы для создания собственного API с Node.js и SQLite, используя Express.js рамки. Желаю удачи!