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.