Tạo Mock API với JSON Server
Trong quá trình phát triển app mobile đôi lúc server lăn đùng ra chết hoặc đường dây mạng trong công ty có vấn đề, bạn phải chờ cho đến khi phục hồi được server hoặc đường truyền ổn định mới có thể test và code tiếp. Quá lãng phí thời gian phải không? Để giải quyết vấn đề này thì tạo mock api chính ...
Trong quá trình phát triển app mobile đôi lúc server lăn đùng ra chết hoặc đường dây mạng trong công ty có vấn đề, bạn phải chờ cho đến khi phục hồi được server hoặc đường truyền ổn định mới có thể test và code tiếp. Quá lãng phí thời gian phải không? Để giải quyết vấn đề này thì tạo mock api chính là giải pháp giúp chúng ta tránh được việc phụ thuộc vào response từ server trả về. Bài viết này sẽ giới thiệu về JSON Server giúp chúng ta tạo mock api một cách đơn giản và nhanh chóng.
Cài đặt json-server bằng câu lệnh sau
npm install -g json-server
Tạo một json database và đặt tên db.json như mẫu dưới đây:
{ "users": [ { "id": 1, "userId": 101, "name": "Alice" }, { "id": 2, "userId": 102, "name": "Bob" }, { "id": 3, "userId": 103, "name": "Carol" } ] }
Khởi tạo server với database vừa tạo
json-server --watch db.json
Bạn đã có thể request tới server theo link sau:
curl http://localhost:3000/users
Lệnh GET request sẽ trả về dữ liệu đã tạo trong file json database. Ta hãy thêm mới dữ liệu vào database bằng lệnh POST như sau:
curl -d "userId=104&name=Dan" http://localhost:3000/users
Nếu bạn muốn tạo các route khác nhau hay tạo package.json như sau:
{ "name": "json-server-test", "main": "server.js", "scripts": { "start": "node server.js" }, "devDependencies": { "json-server": "^0.14.0" } }
và một server.js như sau:
const jsonServer = require('json-server'); const server = jsonServer.create(); const router = jsonServer.router('./db.json'); const middlewares = jsonServer.defaults(); const port = process.env.PORT || 3000; server.use(middlewares); server.use(router); server.listen(port);
Với server.js ta sẽ tạo server, thiết lập database và router và sử dụng default middlewares.
Để mở rộng route ta cần thêm rewriter.
server.use(jsonServer.rewriter({ '/api/users': '/users' }));
Để tuỳ chỉnh route cho lệnh POST ta cần sử dụng bodyParser
server.use(jsonServer.bodyParser)
server.post('/post/user', (req, res) => { if (req.method === 'POST') { let userId = req.body['userId']; if (userId != null && userId >= 0) { let result = db.users.find(user => { return user.userId == userId; }) if (result) { let {id, ...user} = result; res.status(200).jsonp(user); } else { res.status(400).jsonp({ error: "Bad userId" }); } } else { res.status(400).jsonp({ error: "No valid userId" }); } } });
Như vậy, điểm khác biệt duy nhất ở đây đó là ta lấy body từ request thay vì query. Nếu bạn không sử dụng bodyParse thì phần body sẽ không được định nghĩa curl -d "userId=101" http://localhost:3000/post/user
Kết quả :
Phần tạo moke api đã xong, nhưng giả sử bạn cần rất nhiều dữ liệu trong database hàng ngàn record chẳng hạn. Khi đó, việc tạo dữ liệu thủ công tỏ ra không hiệu quả. Faker sẽ giúp chúng ta giải quyết vấn đề này Cài đặt Faker
npm install --save faker
Tạo và chạy một js như sau
var faker = require('faker'); function generateData () { var messages = []; for (var id = 0; id < 10; id++) { let priority = faker.random.number({min: 1, max: 2}); let date = faker.date.between("2018-01-01", "2018-07-31").toISOString().split("T")[0]; let fromId = faker.random.number({min: 1000, max: 9999}) let message = faker.hacker.phrase(); let status = faker.random.number(1); messages.push({ "id": id, "from_userId": fromId, "date_sent": date, "priority": priority, "message": message, "status": status }); } return {messages}; } module.exports = generateData;
json-server generate-data.js
Kiểm tra dữ liệu vưa tạo bằng lệnh GET
Ngoài việc lưu server trên máy local bạn hoàn toàn có thể đưa mock api server của mình lên Heroku https://www.heroku.com/ rất dễ dàng và miễn phí bằng tài khoản cá nhân
Bài viêt này được dịch từ https://spin.atomicobject.com/2018/10/08/mock-api-json-server/