Mr Sói

Dựng một API RESTful đơn giản sử dụng Express và MongoDB

Hì bài này mình viết ở blog của mình rồi chuyển qua nên có thể có một số từ hay một số câu cú không hợp với viblo của mình thì mọi người góp ý nha.. Dựng một API RESTful đơn giản sử dụng Express và MongoDB là bài đầu

Hì bài này mình viết ở blog của mình rồi chuyển qua nên có thể có một số từ hay một số câu cú không hợp với viblo của mình thì mọi người góp ý nha.. Dựng một API RESTful đơn giản sử dụng Express và MongoDB là bài đầu tiên của blog này của mình... Hì, build ra cái blog rồi để gần tuần mới viết bài đầu tiên thì chắc Khoản là người đầu tiên.. Hì, thật ra thì đang tìm ý tưởng viết thôi... :V :V Mà thôi, bỏ qua vấn đề đó mình sẽ vào vấn đề chính là dựng một API RESTful về quản lý người dùng sử dụng Node nha.. :)))

1. Tạo ứng dụng và cài Dependencies cần thiết:

Kiểm tra nodejs và npm version:

npm -v
#6.0.1
node -v
#v10.1.0

1.1 Khởi tạo ứng dụng:

Tạo thư mục và di chuyển vào thư mục.

mkdir user-api
cd user-api

Khởi tạo project nodejs:

npm init -y

Hì bài này mình viết ở blog của mình rồi chuyển qua nên có thể có một số từ hay một số câu cú không hợp với viblo của mình thì mọi người góp ý nha.. Dựng một API RESTful đơn giản sử dụng Express và MongoDB là bài đầu tiên của blog này của mình... Hì, build ra cái blog rồi để gần tuần mới viết bài đầu tiên thì chắc Khoản là người đầu tiên.. Hì, thật ra thì đang tìm ý tưởng viết thôi... :V :V Mà thôi, bỏ qua vấn đề đó mình sẽ vào vấn đề chính là dựng một API RESTful về quản lý người dùng sử dụng Node nha.. :)))

1. Tạo ứng dụng và cài Dependencies cần thiết:

Kiểm tra nodejs và npm version:

npm -v
#6.0.1
node -v
#v10.1.0

1.1 Khởi tạo ứng dụng:

Tạo thư mục và di chuyển vào thư mục.

mkdir user-api
cd user-api

Khởi tạo project nodejs:

npm init -y

2.2 Kết nối server với mLab /utils/db.js:

Thử tạo một thư mục có tên là utils và tạo một file có tên là db.js nha. ( Đây là cá nhân mình thích tách chức năng nhỏ ra các file nhỏ thôi. )

Nội dung file kết nối database db.js sẽ có nội dung tương tự như thế này:

var mongoose = require('mongoose');

const mlabURI = 'mongodb://huynhduckhoan:huynhduckhoan@ds129560.mlab.com:29560/user-api'
const dbName = 'user-api';

const con = mongoose.connect(mlabURI, (error) => {
	if(error){
		console.log("Error " + error);
	}else{
		console.log("Connected successfully to server")
	}
});

module.exports = con;

Thêm một đoạn để nhận kết quả kết nối cơ sở dữ liệu vào server.js

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

Chạy lại project thì thấy giống như hình là oke.. :)))

Xong mấy bước căn bản rồi đấy, vui lên đi nào.. :V :V

3. Tạo model user:  /models/user.js

Một model schema thì của mongoose thì có nội dung tương tự như thế này:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const db = require('../utils/db');
const autoIncrement = require('mongoose-auto-increment');

var userSchema = new Schema({
    userID: {
        type: Number, 
        required: true, 
        unique: true},
    email: {
        type: String, 
        required: true, 
        unique: true},
    password: { 
        type: String, 
        required: true },
    role:  { 
        type: String, 
        required: true,
        default: 'user'},
	dateAdded : { type: Date, default: Date.now },
})

const User = mongoose.model('User', userSchema);
autoIncrement.initialize(mongoose.connection);
userSchema.plugin(autoIncrement.plugin, { model: 'User', field: 'userID' });

module.exports = {
    User
};

đọc code cũng khá là dễ hiểu nên mình không nói gì cho dài thêm bài viết, nếu có thì có đoạn tự động tăng cho userID là đáng nói :

autoIncrement.initialize(mongoose.connection);
userSchema.plugin(autoIncrement.plugin, { model: 'User', field: 'userID' });

Ở đây, autoIncrement sẽ phải kết nối với mongodb để nếu như userID trong request của client không có thì sẽ tự động chọn một số để tăng lên.

Còn đoạn này sẽ lấy thời gian bây giờ ( Tức lúc thêm )  làm ngày thêm cho user.

dateAdded : { type: Date, default: Date.now }

4. Khởi tạo express router:

Về cơ bản thì router của user nó sẽ có như thế này:

Route HTTP Verb Description
/user GET Nhận tất cả thông tin user
/user POST thêm một user
/user/:userID GET Lấy thông tin của user có userID
/user/:userID PUT Cập nhật thông tin user có userID
/user/:userID DELETE Xóa user có userID

Theo thứ tự mình sẽ lần lượt trình bày đống code có chức năng theo thứ tự nha:

app.get('/user', (req, res) => {
  User.find().then((user) => {
    res.send({user});
  }, (e) => {
    res.status(400).send(e);
  });
});

Tạm hiểu đoạn 'GET /user' : Khi có request tới /user thì sẽ tìm các documents  thuộc collection là users mà chính xác hơn phải nói là thuộc userSchema và in ra nếu tìm được, còn nếu không thực hiện được thì sẽ trả về lỗi 400 và gửi ra lỗi. :))) Vì code mongoose khá là dễ hiểu nên mình hướng dẫn cụ thế mà chỉ hướng dẫn đơn giản một lần như như thế. Bạn nào cần có thế lên trang chủ document của mongoose mà tìm hiểu thêm.. :)))

app.post('/user', (req, res) => {
    var user = new User({
        userID: req.body.userID,
        email: req.body.email,
        password: req.body.password,
        role: req.body.role
    });
    // result = User.addUser(user);
    user.save().then((user) => {
      res.send(user);
    }, (e) => {
      res.status(400).send(e);
    });
});
app.get('/user/:userID', (req, res) => {
  var userID = req.params.userID;

  User.findOne({userID:userID}).then((user) => {
    res.send(user);
  }, (e) => {
    res.status(400).send(e);
  });
});
app.put('/user/:userID', (req, res) => {
  var query = { userID: req.params.userID };

  User.findOneAndUpdate(query, {
    role: req.body.role,
    password: req.body.password
  }, {upsert:true}, (e, raw) => {
    if (e) {
      res.status(400).send('Invalid user supplied');
    }
    res.send(raw);
  });
});
app.delete('/user/:userID', (req, res) => {
  var query = { userID: req.params.userID };
  User.findOneAndRemove(query, 
    (e, raw) => {
      if (e) {
        res.status(400).send('Invalid username supplied');
      }
    res.send(raw);
  });
});

5. Kiểm tra lại API bằng postman:

Oke... Mọi thứ đều hoạt động tốt.. :)))
Oke, Các bạn có thể xem code tại github của mình là f97/user-api.

Author image
Website
Nhiều năm qua, tôi luôn học tập một việc, chính là không quay đầu lại, chỉ vì bản thân chưa từng làm chuyện gì phải hối hận, không hối hận vì những chuyện mình đã làm.