Простой CRUD с использованием MySQL и Node Js
CRUD — это аббревиатура от «CREATE, READ, UPDATE, DELETE» в SQL. По сути, мы собираемся продемонстрировать, как использовать MySQL в Node JS. Существует множество руководств о том, как создать CRUD с помощью Mongo DB, но мы действительно хотим показать здесь, как использовать SQL в Node Js.
ЧТО ВАМ НУЖНО ДЛЯ ЭТОГО РУКОВОДСТВА?
ЭС6/ЭС7
MySQL
НЕКОТОРЫЕ БАЗОВЫЕ ЗНАНИЯ NODE JS
ЧТО МЫ БУДЕМ СТРОИТЬ?
Мы собираемся создать TODO LIST с помощью Node JS, используя ES6 и Common JS. Все, что нам нужно в этом проекте, это «promise-mysql». Давайте установим: npm i -s promise-mysql
joanvasquez@local-coderghost:~/git/github/NodeJs-MySQL$ npm i -s promise-mysql
+ promise-mysql@3.3.1
updated 1 package and audited 18 packages in 1.21s
found 0 vulnerabilities
После установки пакета promise-mysql создадим структуру проекта.
# APP STRUCTURE
* app.js -> the main file to run our project
* dbConnection.js
* queries
- queries.js
* Dao
- TodoDao.js
ВРЕМЯ КОДИТЬ
Первое, что нам нужно сделать, это создать dbConnection.js.
const mysql = require('promise-mysql');
const dbConfig = {
user: "joanvasquez",
password: "Password2288_",
database: "todo_dev",
host: "localhost",
connectionLimit: 10
}
module.exports = async () => {
try {
let pool;
let con;
if (pool) con = pool.getConnection();
else {
pool = await mysql.createPool(dbConfig);
con = pool.getConnection();
}
return con;
} catch (ex) {
throw ex;
}
}
Как мы видим, у нас есть объект с именем dbConfig, который содержит только информацию, необходимую для подключения к базе данных. Позже мы экспортируем асинхронную функцию, которая вернет соединение, полученное из пула соединений. Теперь давайте напишем несколько запросов для выполнения нашего CRUD.
module.exports = {
insert_todo: `INSERT INTO tbl_todo(title, completed) VALUES(?, ?)`,
read_todo: `SELECT * FROM tbl_todo`,
update_todo: `UPDATE tbl_todo SET tbl_todo.title = ?, tbl_todo.completed = ? WHERE tbl_todo.id = ?`,
delete_todo: `DELETE FROM tbl_todo WHERE tbl_todo.id = ?`
}
После создания запросов мы должны создать DAO и использовать наши запросы, я имею в виду, почему бы и нет?
const dbConnection = require("../dbConnection");
const queries = require("../queries/queries");
module.exports = class TodoDao {
async saveEntity(entity) {
let con = await dbConnection();
try {
await con.query("START TRANSACTION");
let savedTodo = await con.query(
queries.insert_todo,
[entity.title, entity.completed]
);
await con.query("COMMIT");
entity.id = savedTodo.insertId;
return entity;
} catch (ex) {
await con.query("ROLLBACK");
console.log(ex);
throw ex;
} finally {
await con.release();
await con.destroy();
}
}
async updateEntity(entity) {
let con = await dbConnection();
try {
await con.query("START TRANSACTION");
await con.query(queries.update_todo, [
entity.title,
entity.completed,
entity.id
]);
await con.query("COMMIT");
return true;
} catch (ex) {
await con.query("ROLLBACK");
console.log(ex);
throw ex;
} finally {
await con.release();
await con.destroy();
}
}
async deleteEntity(id) {
let con = await dbConnection();
try {
await con.query("START TRANSACTION");
await con.query(queries.delete_todo, [id]);
await con.query("COMMIT");
return true;
} catch (ex) {
await con.query("ROLLBACK");
console.log(ex);
throw ex;
} finally {
await con.release();
await con.destroy();
}
}
async readEntities() {
let con = await dbConnection();
try {
await con.query("START TRANSACTION");
let todo = await con.query(queries.read_todo);
await con.query("COMMIT");
todo = JSON.parse(JSON.stringify(todo));
return todo;
} catch (ex) {
console.log(ex);
throw ex;
} finally {
await con.release();
await con.destroy();
}
}
};
Этот класс имеет все методы для CRUD. Все, что нам нужно сделать, это «НАЧАТЬ ТРАНЗАКЦИЮ, выполнить наш запрос и «КОММИТ» в БАЗУ ДАННЫХ». Наконец, мы должны выполнить методы CRUD.
const TodoDao = require("./Dao/TodoDao");
const todoDao = new TodoDao();
const app = async () => {
let savedTodo = await todoDao.saveEntity({
title: "Read a book of JS",
completed: 0
});
console.log("Saved todo --> ", savedTodo)
savedTodo.completed = 1;
let isUpdated = await todoDao.updateEntity(savedTodo);
console.log("Is it updated --> ", isUpdated);
let todoList = await todoDao.readEntities();
console.log("List of todo --> ", todoList);
let isDeleted = await todoDao.deleteEntity(savedTodo.id);
console.log("Is it deleted --> ", isDeleted)
}
app();
И результат:
Saved todo --> { title: 'Read a book of JS', completed: 0, id: 1 }
Is it updated --> true
List of todo --> [ { id: 1, title: 'Read a book of JS', completed: 1 } ]
Is it deleted --> true