Работаем с базой SQLite прямо из JavaScript
Сегодня мы поработаем с sqlite3, post-запросами и с шаблонами в node.js.
Для начала установим sqlite3. На Linux он ставится следующими командами:
sudo apt-get install sqlite3 libsqlite3-dev
В папке нашего проекта создадим новую базу sqlite:
sqlite3 articles.db
После создадим таблицу в ней.
sqlite3
В консоли вы увидите сообщение:
SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
Dводим следующую команду:
create table posts(id not null primary key, text TEXT, title TEXT);
Стоит отметить, что в sqlite3 существует несколько классов хранения.
NULL, INTEGER, REAL, TEXT, BLOB. Подробнее о них здесь.
Если после добавления таблицы у вас не вывелось ошибок, то посмотреть все таблицы можете командой
.tables
Выходим из sqlite командой .quite
Далее будем работать с БД средствами Node.js.
Добавим модуль для работы с БД.
npm install sqlite3 --save
Откроем наш файл, в моём случае это server.js и подключим только что установленный модуль
var sqlite3 = require('sqlite3').verbose();
Далее создадим страницу с формой, где будем создавать наши записи в БД.
server.get("/form", (request, response)=>{
fs.readFile("./templates/index.html", (error, data)=>{
response.end(data);
});
});
Обратите внимание, что мы подключаем .html шаблон. Для этого подключим модуль fs:
var fs = require('fs');
Затем создадим папку template в корне проекта и файл index.html.
Содержание index.html самое примитивное:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Forms</title>
</head>
<body>
<form action="/add" method="post">
<input type="text" name="title">
<textarea name="text" id="" cols="30" rows="10"></textarea>
<input type="submit">
</form>
</body>
</html>
Для подключения и вывода шаблона используем метод readFile объекта fs. Первый аргумент путь до шаблона, второй - callback, с двумя аргументами error и data.
error будет содержать ошибки, если они будут.
data - хранит в себе содержимое шаблона.
С помощью response.send выводим, то что хранится в data.
Далее нам надо обрабатывать post запросы. Это делается так.
var urlencodedParser = bodyParser.urlencoded({extended: false});
server.post("/add", urlencodedParser, (request, response)=>{
let db = new sqlite3.Database('./articles.db');
var title = request.body.title;
var text = request.body.text;
db.run(`Insert into posts(title, text) values(?,?)`, [title, text], (err)=>{
if(err){
response.send(err.message);
}
response.send(`${request.body.title} - ${request.body.text}`);
});
db.close();
});
С помощью bodyParser мы отделим нужное от ненужного. А точнее данные из формы, от всего что пришло от клиента.
Значение extended: false
указывает, что объект - результат парсинга будет представлять набор пар ключ-значение
Не забудем установить его
npm install body-parser --save
и подключить:
var bodyParser = require("body-parser");
var urlencodedParser = bodyParser.urlencoded({extended: false});
Далее создаём соединение с базой данных, которую мы создали.
let db = new sqlite3.Database('./articles.db');
И запишем в переменную, то что мы хотим получим. Данные из POST запроса мы получаем с помощью объекта request.body.{par}
, где {par} - POST параметр, который нам нужен.
Далее запишем полученные данные в БД. С помощью метода run объекта db.
В него первым аргументом передаём запрос, вторым параметры запроса, третьим callback. callback выведет ошибку если она есть.
Если всё хорошо, то мы просто выведем, то что получили из формы. И закроем подключение к БД.
Было бы замечательно посмотреть, что мы добавили. Это мы сделаем на главной странице.
server.get("/", (request, response)=>{
let db = new sqlite3.Database('./articles.db');
let sql = "select title, text from posts";
db.all(sql, [], (err, rows)=>{
if(err){
response.send(err.message);
}
let string = '';
rows.forEach((row)=>{
string += `${row.title} - ${row.text}</br>`;
});
response.send(string);
});
db.close();
});
Тут мы меняем содержание callback.
Первым делом подключаемся к БД.
Запишем sql запрос в переменную.
Выполним запрос методом db.all.
Так же как и db.run три аргумента: запрос, параметры и callback. Здесь calback возвращает два параметра. error - ошибку, и rows - данные из БД.
Пройдёмся по этим данным циклом и запишем их в переменную, которую объявим ранее:
let string= '';
Сам цикл
rows.forEach((row)=>{
string += `${row.title} - ${row.text}</br>`;
});
response.send(string);
В каждой итерации цикла, добавим в переменную строку из нашего заголовка и текста.
И выведем на экран с помощью response.send. Не забываем закрыть соединение.
Материал подготовлен автором @zheev