Lần đầu sử dụng Node JS - MySQL - Docker viết API



Hi mọi người

Bài viết này là kết quả học tập với Node JS và Docker sau một thời gian tìm kiếm, tham khảo nhiều nơi.

Mình khá hứng thú mỗi khi đi học hỏi, tìm tòi một công nghệ mới.

Sau đây là những chia sẻ của mình về project này.

Đầu tiên đó là cấu trúc :

Và các thư viện được cài đặt

- npm install body-parser

- npm install dotenv

- npm install express

- npm install mysql

- Bước 1:  Chúng ta tạo và cấu hình file .env

MYSQLDB_USER=root
MYSQLDB_ROOT_PASSWORD=123456
MYSQLDB_DATABASE=nodejs_api
MYSQLDB_LOCAL_PORT=3306
MYSQLDB_DOCKER_PORT=3306

NODE_LOCAL_PORT=6868
NODE_DOCKER_PORT=8080

CLIENT_ORIGIN=http://127.0.0.1:8888
CLIENT_API_BASE_URL=http://127.0.0.1:6868/api

REACT_LOCAL_PORT=8888
REACT_DOCKER_PORT=80

- Bước 2 : Tạo và cấu hình file docker-compose.yml

version: '3.8'

services:
mysqldb:
image: mysql:5.7
restart: unless-stopped
env_file: ./.env
environment:
- MYSQL_ROOT_PASSWORD=$MYSQLDB_ROOT_PASSWORD
- MYSQL_DATABASE=$MYSQLDB_DATABASE
- DB_HOST=mysqldb
- DB_USER=$MYSQLDB_USER
- DB_PASSWORD=$MYSQLDB_ROOT_PASSWORD
ports:
- ${MYSQLDB_LOCAL_PORT}:$MYSQLDB_DOCKER_PORT
volumes:
- db:/var/lib/mysql
networks:
- backend

volumes:
db:

networks:
backend:

- Bước 3 : Tạo và code của file server.js

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const port = process.env.PORT || 3000;

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

let routes = require('./api/routes'); //importing route
routes(app);

app.use(function(req, res) {
res.status(404).send({ url: req.originalUrl + ' not found' });
});

app.listen(port);

console.log('RESTful API server đã bắt đầu: ' + port);

- Bước 4 : Trong folder api ta có những file sau :

     routes.js

    module.exports = function(app) {
    let user = require('./controllers/users.controller');
    app.route('/get-users/:userID').get(user.findOne)
    app.route('/create-users').post(user.createUser)
    app.route('/get-all-users').get(user.findAll)
    app.route('/update-user/:userId').put(user.update)
    app.route('/delete-user/:userId').delete(user.delete)
    };

       db.js

    const mysql = require('mysql');

    const db = mysql.createConnection({
    host: process.env.DB_HOST || 'localhost',
    user: process.env.DB_USER || 'root',
    password: process.env.DB_PASS || '123456',
    database: process.env.DB_NAME || 'nodejs_api',
    });

    module.exports = db;

     - Tiếp đến, folder controllers chứa file sau :

     app/controllers/users.controller.js

    const Users = require('../models/users.model');

    exports.findOne = (req, res) => {
    Users.findById(req.params.userID, (err, data) => {
    if (err) {
    if (err.kind === 'not_found') {
    res.status(400).send({
    message: `Không tìm thấy id : ${req.params.userID}`
    })
    } else {
    res.status(500).send({
    message: "Kết quả trả về lỗi ở id : " + req.params.userID
    })
    }
    } else {
    res.send(data);
    }
    })
    }

    exports.createUser = (req, res) => {
    if (!req.body) {
    res.status(400).send({
    message: "Nội dung gửi lên không được rỗng"
    })
    }

    const user = new Users({
    name : req.body.name,
    gmail: req.body.gmail,
    phone: req.body.phone
    })

    Users.create(user, (err, data) => {
    if (err) {
    res.status(500).send({
    message: err.message
    })
    } else {
    res.send(data)
    }
    })
    }

    exports.findAll = (req, res) => {
    Users.getAll((err, data) => {
    if (err) {
    res.status(500).send({
    message: err.message
    })
    } else {
    res.send(data)
    }
    })
    }

    exports.update = (req, res) => {
    if (!req.body) {
    res.status(400).send({
    message: "Nội dung không được rỗng"
    })
    }
    
    Users.updateUser(req.params.userId, new Users(req.body), (err, data) => {
    if (err) {
    if (err.kind === "not_found") {
    return res.status(400).send({
    message: `Không tìm thấy User id : ${req.params.userId}`
    })
    } else {
    res.status(500).send({
    message: err.message
    })
    }
    } else {
    res.send(data)
    }
    })
    }

    exports.delete = (req, res) => {
    Users.deleteUser(req.params.userId, (err, data) => {
    if (err) {
    if (err.kind === "not_found") {
    return res.status(400).send({
    message: `Không tìm thấy User id : ${req.params.userId}`
    })
    } else {
    res.status(500).send({
    message: err.message
    })
    }
    }

    res.send(data)
    })

    }

 - Và folder models chứa file sau :

   app/models/users.model.js

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

    const Users = function (user) {
    this.name = user.name;
    this.gmail = user.gmail;
    this.phone = user.phone;
    }
    Users.findById = (userID, result) => {
    db.query(`SELECT *
    FROM users
    WHERE id = ${userID}`, (err, res) => {
    if (err) {
    return result(err, null);
    }

    if (res.length) {
    return result(null, res[0])
    }

    result({kind: "not_found"}, null)
    })
    }

    Users.create = (newUsers, result) => {
    db.query("INSERT INTO users SET ? ", newUsers, (err, res) => {
    if (err) {
    return result(err, null)
    }

    result(null, newUsers)
    })
    }

    Users.getAll = (result) => {
    db.query("SELECT * FROM users", (err, res) => {
    if (err) {
    return result(err, null)
    }

    result(null, res)
    })
    }

    Users.updateUser = (id, users, result) => {
    db.query("UPDATE users SET name = ?, gmail = ?, phone = ? WHERE id = ?", [
    users.name, users.gmail, users.phone, id
    ], (err, res) => {
    if (err) {
    return result(null, err)
    }

    if (res.affectedRows == 0) {
    return result({kind : "not_found"}, null);
    }

    result(null, {id : id, ...users})
    })
    }

    Users.deleteUser = (id, result) => {
    db.query(`DELETE FROM users WHERE id = ?`, [id], (err, res) => {
    if (err) {
    return result(null, err)
    }

    if (res.affectedRows == 0) {
    return result({kind : "not_found"}, null);
    }
    result(res, null)
    })
    }


    module.exports = Users

Bước 5 : Bạn chạy lệnh này để build docker

docker-compose up

Hãy download phần mềm Docker về nhé, để dễ quản lý.

Sau khi build xong, bạn mở MySQL Workbench lên sau khi bạn kết nối thì popup sẽ hiển thị để kết nối tới database

Bạn phải nhập đúng thông tin như trong file .env mà bạn đã cấu hình

Và tạo table users ( id, name, gmail, phone )

Cuối cùng, bạn chạy lệnh này npm start  để xem kết quả nhé.

Chúc các bạn thành công.

Previous Post Next Post