MỘT VÍ DỤ RÕ RÀNG HƠN VỀ ROUTE TRONG NODE.JS VÀ EXPRESS.



Trong phần mềm, phần định tuyến (route) là rất quan trọng bởi vì nó định nghĩa một URL để giao tiếp với ứng dụng.
Nếu nó không được tổ chức tốt thì về mặt logic là rất khó cho việc bảo trì sau này.         
Trong ví dụ này ta sử dụng express frameworks để xây dựng một cars API đơn giản.

GET /models
GET /models/:modelId
GET /models/:modelId/cars
GET /cars
GET /cars/:carId

Trước tiên ta tạo thư mục project có tên là: car-api và cài đặt các thư viện cho nó:

mkdir car-api
cd car-api
npm init -y
npm i -S express
npm i -D nodemon

Thêm phần start ứng dụng vào package.json

"start": "nodemon app.js"

Tạo một file JSON để lưu trữ dữ liệu API như dưới: 

{
  "models": [
    {
      "id": 1,
      "name": "Toyota"
    },
    {
      "id": 2,
      "name": "Mazda"
    }
  ],
  "cars": [
    {
      "id": 1,
      "name": "Corolla",
      "modelId": 1
    },
    {
      "id": 2,
      "name": "Mazda3",
      "modelId": 2
    },
    {
      "id": 3,
      "name": "Mazda6",
      "modelId": 2
    },
    {
      "id": 4,
      "name": "Miata",
      "modelId": 2
    },
    {
      "id": 5,
      "name": "Camry",
      "modelId": 1
    },
    {
      "id": 6,
      "name": "CX-9",
      "modelId": 2
    }
  ]
}

Tạo file app.js chính và add code cơ bản vào: 

// Bring in our dependencies
const app = require('express')();
const routes = require('./routes');

//  Connect all our routes to our application
app.use('/', routes);

// Turn on that server!
app.listen(3000, () => {
  console.log('App listening on port 3000');
});

Ứng dụng chạy trên port 3000. Và route chính / đươc điểu khiển  bởi file trong folder : routes

Tạo file routes/index.js có nội dung như sau : 

const routes = require('express').Router();

routes.get('/', (req, res) => {
  res.status(200).json({ message: 'Connected!' });
});

module.exports = routes;

File trên là tạo một instance của Router và đặt nó trong biến có tên gọi là: routes 
Và khi một user truy cập vào đường dẫn chính / thì nó sẽ trả về thông điệp json : 

message: 'Connected!' 
}


Như API trên, giờ ta tạo route model /route/models/index.js như sau : 

const models = require('express').Router();
const all = require('./all');

models.get('/', all);

module.exports = models;

File trên ta route tất cả vào file all.js trên cùng thư mục của file index.js này. 
Tạo file /routes/models/all.js 

const data = require('../../data.json');

module.exports = (req, res) => {
  const models = data.models;

  res.status(200).json({ models });
};

File tren import data vào và gôm tất cả các models, trả về trong response. 
Thêm code vào file routes/index.js 

const models = require('./models');
routes.use('/models', models);

Sau đó thử truy cập vào: http://localhost:3000/models 


Bây giờ ta tạo một route tiếp theo mà ta có thể xem chỉ một model. Tạo file single.js trong /routes/models/single.js 

const data = require('../../data.json');

module.exports = (req, res) => {
  const modelId = req.params.modelId * 1;
  const model = data.models.find(m => m.id === modelId);

  res.status(200).json({ model });
}; 

 req.params.modelId * 1: là biến một string thành một interger

Ta thêm route vào /routes/models/index.js 

const single = require('./single');
models.get('/:modelId', single);

Xong, thử truy cập vào http://localhost:3000/models/2 


Giờ đến API /models/:modelsId/car

Thêm route car vào /routes/models/index.js 

const cars = require('./cars');
models.use('/:modelId/cars', cars);

Tạo file index.js /routes/models/cars/index.js 

const cars = require('express').Router({ mergeParams: true });
const all = require('./all');

cars.get('/', all);

module.exports = cars;

Bây giờ ta tạo file all.js /routes/models/cars/all.js 

const data = require('../../../data.json');

module.exports = (req, res) => {
  const modelId = req.params.modelId * 1;
  const cars = data.cars.filter(c => c.modelId === modelId);

  res.status(200).json({ cars });
};

Bây giờ ta thử truy cập vào http://localhost:3000/models/1/cars


Giờ tạo API cars /cars 

thêm route vào file index.js /routes/index.js 

const cars = require('./cars');
routes.use('/cars', cars);

Tương tự như trên tao tạo file index.js trong /routes/index.js 

const cars = require('express').Router();
const all = require('./all');
const single = require('./single');

cars.get('/', all);
cars.get('/:carId', single);

module.exports = cars;

Sau đó tạo 2 file all.js và single.js trong routes/cars

const data = require('../../data.json');

module.exports = (req, res) => {
  const cars = data.cars;

  res.status(200).json({ cars });
};

và file single.js 

const data = require('../../data.json');

module.exports = (req, res) => {
  const carId = req.params.carId * 1;
  const car = data.cars.find(c => c.id === carId);

  res.status(200).json({ car });
};


Thử truy cập vào : http://localhost:3000/cars và http://localhost:3000/cars/3



và 


Bây giờ ta thử truy cập vào http://localhost:3000/models/200 sẽ ra trang lỗi, ta redirect qua lỗi 404 thì làm như sau: 

Thêm vào routes/models/index.js 


const data = require('../../data.json');

models.param('modelId', (req, res, next, value) => {
  const model = data.models.find(m => m.id === (value * 1));

  if (model) {
    req['model'] = model;
    next();
  } else {
    res.status(404).send('Invalid model ID');
  }
});

Chi tiết liên hệ : http://manageitservice247.com

Nhận xét

Bài đăng phổ biến từ blog này

Cách sử dụng sys.argv trong python.

Trang web medium.com chết, vì sao ?

Thiết kế một RESTful API bằng python và flask.