Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
vp-webdev
6 лет назад

Работаем с базой 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

615
15.132 GOLOS
На Golos с August 2017
Комментарии (1)
Сортировать по:
Сначала старые