Bài 3: giả lập dataset dùng cho project Movie API không có xét kết nối đến csdl MongoDBTa code đọc tập tin json và hiển thị ra web như sau Ghi chú: để hiển thị json ra web đẹp thì cài th
Trang 1Xây dựng REST API Service với Node và Express
Bài 1 Sơ lược về REST
Trang 3Để nhận biết các request xử lý như thế nào cần biết HTTP status code
Trang 4Bài 2: Hello Express
1 Tạo package.json
2 Cài đặt express
3 Và tạo route như sau
hoặc dùng hàm mũi tên và tạo handler riêng và gắn vô như sau
Trang 6Bài 3: giả lập dataset dùng cho project Movie API (không có xét kết nối đến csdl MongoDB)
Ta code đọc tập tin json và hiển thị ra web như sau
Ghi chú: để hiển thị json ra web đẹp thì cài thêm extension json formatter trong chrome
Trang 7Bài 4: cú pháp Javascript ES5, ES6 OOP
ES5 (đối tượng là object dưới dạng function) ES6 (dưới dạng class)
Trang 8Bài 5: xây dựng class MovieStore
index.js sử dụng class đã tạo
Sau đó chỉnh lại route "/" thành "/movies" và chạy web để ra kết quả tương tự
Trang 9Bài 6: Chuyển hướng route để khi vào "/" cũng truy cập được movies
Trang 10Bài 7: Xử lý route parameter
Trang 11Bài 8: Thay đổi HTTP Status Code
Trang 12Bài 9: Xây dựng API lấy thông tin movie theo tiêu đề
Mở rộng class MovieStore, viết thêm hàm find
Trang 13ví kết quả của hàm filter trả về mảng nên file index ta kiểm tra chiều dài mảng xem có dữ liệu cần tìm không, nếu không
có thì thiết lập statusCode=404, ngược lại gửi thông tin về client như hình sau
Trang 14Bài 10: xử lý nhận request body
Lấy dữ liệu ở body gửi lên dạng json gửi lên bằng cách dùng middleware (chuyển dữ liệu từ request vào handler)Bước 1: cài body-parser như sau
npm install save body-parser
Bước 2: dùng body-parser
Để biết client gửi lên với phương thức gì ta code như sau
Trang 15Bài 11: Xây dựng API thêm movie mới
Viết thêm hàm add cho class MovieStore
Và trong index.js ta gọi hàm add để thêm thông tin từ client gửi bằng post lên server
Trang 16Bài 12: Kiểm tra request input
Ta làm điều này để tránh trường hợp khi thông tin gửi lên để tìm kiếm không có tiêu đề (title), để người dùng không được bỏ trống title hoặc title toàn ký tự trắng cũng không cho, và kiểm tra xem movie có chưa vì nếu có rồi thì không cầnadd vào nữa,
Như vậy ta cần viết thêm hàm has trong class MovieStore
Trang 17Bài 13: Cú pháp Javascript ES6 Object assign
Nếu không dùng các gán thì 2 biến cùng trỏ đến tham chiếu và kết quả ảnh hưởng nhau (dùng chung vùng nhớ)
Sau khi dùng assign ta được kết quả phân biệt giữa 2 đối tượng (copy và tạo vùng nhớ riêng)
Trang 18Bài 14: Cú pháp Javascript ES6 Spread operator (toán tử phân giải của mảng)
Nếu gán giá trị thông thường từ mảng qua mảng thì bị tham chiếu cùng ô nhớ, nên khi thay đổi giá trị mảng này thì mảng kia bị ảnh hưởng
mới an toàn và 2 mảng không bị ảnh hưởng nhau
Trong ES6 ta dùng dấu 3 chấm " "
Trang 19Truyền nhiều tham số cho hàm, với cách làm trong ES5 sẽ như sau
nhưng nếu tham số truyền cho sum là 1 mảng thì khi chạy sẽ bị sai
Trang 20Cách giải quyết trong ES6 như sau
ES6 sẽ lấy từng phần tử trong params và truyền từ từ vào hàm sum, chứ không phải lấy nguyên mảng truyền vô hàm, tức
là khi dùng tương đương như sau
Ta cũng có thể truyền nhiều mảng vô như sau
Trang 21Bài 15: Xây dựng API cập nhật (update) movie, ta dùng phương thức put trong index.js
và đồng thời cài đặt hàm update cho lớp MovieStore
Trang 22Thuật toán cài đặt hàm update như sau
Đã cài đặt hàm update
Trang 23Bài 16: Xây dựng API xóa movie, ta dùng http action là delete, ta cần kiểm tra xem có movie không? nếu có thì xóa, ngược lại thì thông báo không tồn tại, action sẽ như sau
và ta vào class MovieStore thêm hàm remove
Trang 24Bài 17: Xây dựng API tìm kiếm movie
Tóm tắt một số kiến thức cần dùng như sau, querystring
từ dấu "?" trở đi là querystring, và nó chứa trong req.query,
Để kiểm tra chuỗi b có trong chuỗi a hay không ta dùng include
viết code cho index như sau
và ta cài đặt thêm hàm search trong class MovieStore như sau
Trang 25Bài 18: Phân trang kết quả tìm kiếm
Áp dụng cho các trường hợp dữ liệu lớn ta cần hiển thị từng phần, vì thế client cần gửi các thông số để phân trangPhân trang: tức là chia nhỏ dữ liệu ra và client lấy dần từng phần, client cần gửi page (cho biết trang là bao nhiêu), size (tức là trong 1 trang client cần bao nhiêu kết quả) Ta dùng hàm tách dữ liệu trong khoảng nào đó chính là việc phân trang
Và ta cần biết thêm thông số có tổng số bao nhiêu bộ phim, ta cải tiến code như sau
Trang 26Nếu query ta chỉ truyền page và không truyền size thì mặc định là 2
Trang 27Nhưng kết quả hiển thị page là chuỗi không phải số, nên ta cần chuyển thành số để sử dụng
Ghi chú: để đảm bảo dữ liệu trả về là định dạng JSON thì ta không dùng res.send() mà dùng res.json()
Trang 28Bài 19: sử dụng router
Nhận xét thấy rằng các router đều có dùng "/movies/ " nên ta tách ra như sau
Bước 1: khai báo biến router
Bước 2: đổi các phần app.get(), app.put(), app.post(), app.delete() thành movieRouter.get(), với router đã tạo ở bước 1
Bước 3: đăng ký router
và để truy cập được "/" ta cần ghi app.get("/", ), chứ không được ghi movieRouter.get("/", )
Cải tiến tiếp tục là tác router thành 1 file riêng và gọi vô dùng để file index gọn gàng như sau