Rest API sử dụng Node Js Express và MySQL

I. RESTful API trong Node.js, Express và MySQL

Một RESTful (Representational State Transfer) API là một application program interface (API) sử dụng những HTTP requests để GET, POST, PUT và DELETE data. Nếu bạn muốn tương tác với một service, hầu hết bạn sử dụng một API. Node.js là một open source server tốt nhất cho việc tạo một API.

Trong bài này chúng ta sẽ học về việc tạo một rest api sử dụng node.js, Express và MySQL database với những phương thức request GET, POST, PUT và DELETE.

Setup Environment

Trước tiên, bạn đã cài đặt node.js trên hệ thống của bạn chưa? Nếu cài rồi, thì bỏ qua bước này, nếu chưa hãy làm nó theo hướng dẫn tại đây  Setup môi trường lập trình Angular 7

Cài đặt Express-generator tool

Chúng ta  cài đặt express-generator. Nếu bạn đã cài express-generator tool rồi thì không cần cài lại nó.

npm install express-generator -g

II. Tạo một Application

Tạo một ứng dụng sử dụng express-generator tool

express --view=hbs autosolapi

Cài đặt những phụ thuộc (Dependencies)

cd restapi
npm install

Cài đặt mysql node modules trong node.js

Trước khi sử dụng mysql trong Node.js, chúng ta phải đảm bảo rằng MySQL Database được cài đặt. Bạn có thể xem tài liệu hướng dẫn cài đặt  tại đây Installing MySQL

Cài đặt mysql node modules cho application của bạn.

npm install mysql

Tạo một Custom Module cho Database Connection

Tạo một file db.js trong root folder để connect database và sử dụng connect này trong toàn bộ dự án của bạn. Connect database của bạn sử dụng MySQL database host, database user, database password và database name.

db.js

var mysql = require('mysql');
var connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: '',
  database: 'noderestapi'
});
connection.connect(function(err) {
  if (err) throw err;
  console.log('connected!');
});
module.exports = connection;

Tạo  Route

Tạo một file routes/products.js cho việc add, edit, views và delete products.

routes/products.js

var express = require('express');
var router = express.Router();
var db = require('../db');
var bodyParser = require('body-parser');

router.use(bodyParser.json()); // for parsing application/json
//router.use(bodyParser.urlencoded({extended: true})); // for parsing application/x-www-form-urlencoded

/* get method for fetch all products. */
router.get('/', function(req, res, next) {
  var sql = "SELECT * FROM products WHERE active=1";
  db.query(sql, function(err, rows, fields) {
    if (err) {
      res.status(500).send({ error: 'Something failed!' })
    }
    res.json(rows)
  })
});

/*get method for fetch single product*/
router.get('/:id', function(req, res, next) {
  var id = req.params.id;
  var sql = `SELECT * FROM products WHERE id=${id}`;
  db.query(sql, function(err, row, fields) {
    if(err) {
      res.status(500).send({ error: 'Something failed!' })
    }
    res.json(row[0])
  })
});

/*post method for create product*/
router.post('/create', function(req, res, next) {
  var name = req.body.name;
  var sku = req.body.sku;
  var price = req.body.price;

  var sql = `INSERT INTO products (name, sku, price, active, created_at) VALUES ("${name}", "${sku}", "${price}", 1, NOW())`;
  db.query(sql, function(err, result) {
    if(err) {
      res.status(500).send({ error: 'Something failed!' })
    }
    res.json({'status': 'success', id: result.insertId})
  })
});

/*put method for update product*/
router.put('/update/:id', function(req, res, next) {
  var id = req.params.id;
  var name = req.body.name;
  var sku = req.body.sku;
  var price = req.body.price;

  var sql = `UPDATE products SET name="${name}", sku="${sku}", price="${price}" WHERE id=${id}`;
  db.query(sql, function(err, result) {
    if(err) {
      res.status(500).send({ error: 'Something failed!' })
    }
    res.json({'status': 'success'})
  })
});

/*delete method for delete product*/
router.delete('/delete/:id', function(req, res, next) {
  var id = req.params.id;
  var sql = `DELETE FROM products WHERE id=${id}`;
  db.query(sql, function(err, result) {
    if(err) {
      res.status(500).send({ error: 'Something failed!' })
    }
    res.json({'status': 'success'})
  })
})

module.exports = router;

Edit app.js

Edit app.js file và import var productsRouter = require('./routes/products'); và set products route app.use('/products', productsRouter);

.....
var productsRouter = require('./routes/products');
.....
.....
app.use('/products', productsRouter);

Code hoàn tành của app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var productsRouter = require('./routes/products');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/products', productsRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

III. MySQL

Tạo một bảng products trong MySQL

CREATE TABLE `products` (
  `id` int(10) UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `sku` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  `price` decimal(8,2) NOT NULL,
  `active` tinyint(1) NOT NULL,
  `created_at` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `products` (`id`, `name`, `sku`, `price`, `active`, `created_at`) VALUES
(1, 'Laptop', 'Laptop', '40000.00', 1, '2019-03-26 18:10:21'),
(2, 'CPU', 'cpu', '8000.00', 1, '2019-03-26 18:10:37'),
(3, 'Keyboard', 'Keyboard', '600.00', 1, '2019-03-26 18:11:01');

IV. Run the app

npm start

Sau đó chạy http://localhost:3000/ trong browser của bạn để truy cập vào app.

Bạn có thể kiểm tra url này http://localhost:3000/products  cho products json data. Bạn sẽ thấy như dưới đây:

Như vậy chúng ta đã hoàn thành Rest API sử dụng Node Js Express và MySQL

Chúc bạn thành công!


Leave a Reply

Your email address will not be published. Required fields are marked *