Thứ tư, 20/03/2019 | 00:00 GMT+7

Giới thiệu về hapi Node.js


Điều tuyệt vời về hệ sinh thái Node.js là nếu bạn đang muốn tạo một ứng dụng, rất có thể sẽ có một module / khung công tác có thể trợ giúp điều đó! Trong bài viết này, ta sẽ tạo một REST API cơ bản với hapi.js.

Bạn cũng có thể quan tâm đến Phát triển và định tuyến API với Node.js và Express !

Hãy bắt đầu bằng cách tạo một dự án mới và cài đặt hapi . Chạy phần sau trong terminal để bắt đầu:

# Create a new directory for the project $ mkdir hapi-api && cd hapi-api  # Initialise a new Node project $ npm init -y  # Install hapi.js $ npm init hapi  # Create a new server file $ touch index.js  # Install nodemon $ npm i nodemon -g  # Run server with nodemon $ nodemon index.js 

Ta đang sử dụng gật đầu để khởi động server ở chế độ đồng hồ.

Điều đầu tiên ta cần làm là tạo một server . Rất may, điều này thật dễ dàng với Node.js!

Tạo server

const Hapi = require('hapi');  const server = Hapi.server({   port: 3000,   host: 'localhost' });  const start = async () => {   await server.start(); };  start(); 

Server hiện đang đợi trên localhost:3000 . Tiếp theo, ta sẽ cài đặt định tuyến để phản hồi trên / route.

server.route({   path: '/',   method: 'GET',   handler: (request, h) => {     return 'Hello, hapi!';   } }); 

Ta có thể kiểm tra xem liệu điều này có trả lại những gì ta mong đợi hay không bằng cách sử dụng curl hoặc một dự án dựa trên GUI như Postman .

$ curl http://localhost:3000/  > Hello, hapi! 

Xin chào, hapi!

Thông số

Ta cũng có thể thực hiện điều này xa hơn với các thông số requesth . Hãy thêm khả năng chuyển các tham số vào URL :

server.route({   path: '/',   method: 'GET',   handler: (request, h) => {     return 'Hello, hapi!';   } });  server.route({   path: '/{id}',   method: 'GET',   handler: (request, h) => {     return `Product ID: ${encodeURIComponent(request.params.id)}`;   } }); 

Trong ví dụ nhỏ , ta đang tưởng tượng rằng ta có một API trả về một sản phẩm cụ thể. Khi nào user yêu cầu http://localhost:3000/123 , họ sẽ nhận lại:

Product ID: 123

Điều này là do đối tượng request.params chứa bất kỳ tham số nào mà ta đã cài đặt trong đường dẫn của bạn .

Lưu ý ta đã bao quanh id bên trong hai dấu ngoặc nhọn: {id} , điều này cho hapi biết rằng ta định cho user thay thế phần đó của URL dưới dạng tham số.

Đồng thời, ta cũng giữ nguyên tuyến đường ban đầu mà không có id . Điều này cho thấy rằng ta có thể có nhiều tuyến nhắm đến đến một mẫu cơ sở tương tự và chúng sẽ không overrides lên nhau. Mỗi cái trở nên cụ thể hơn và nếu nó không trùng với một tuyến đường cụ thể, nó sẽ nhìn lại trong ngăn xếp cho đến khi một cái khớp.

Mặc dù ta đã xem xét GET trong ví dụ này, việc xử lý các động từ HTTP khác được thực hiện tương tự. Kiểm tra định tuyến bên trong tài liệu hapi để biết thêm chi tiết.

bổ sung

Ta cũng có thể sử dụng các plugin trong hapi. Hãy sử dụng plugin good để tăng sức mạnh của khả năng ghi log . Chạy phần sau trong terminal để cài đặt các gói cần thiết:

$ npm install good good-console good-squeeze 

Sau đó, ta cần tạo một đối tượng consoleLogging được dùng để khởi tạo các plugin .

const consoleLogging = {   plugin: require('good'),   options: {     ops: {       interval: 1000     },     reporters: {       consoleReporter: [         {           module: 'good-squeeze',           name: 'Squeeze',           args: [{ response: '*', log: '*' }]         },         { module: 'good-console' },         'stdout'       ]     }   } }; 

Sau đó, ta có thể đăng ký điều này bên trong hàm start :

const start = async () => {   await server.register([consoleLogging]);    await server.start(); }; 

Điều này bây giờ nghĩa là bất kỳ khi nào ta truy cập vào API của bạn , nó sẽ ghi lại một sự kiện vào console . Ta có thể thử điều này bằng cách chuyển đến http://localhost:3000/ bên trong trình duyệt hoặc cách khác, ta có thể sử dụng curl :

$ curl http://localhost:3000/ 

Điều này cho ta kết quả sau:

(Pauls-MacBook-Pro) [response] http://localhost:3000 : get / {} 200 (16ms) 

Tada! 🎉 Bây giờ ta có ghi log tự động cho mọi hành động xảy ra trên server hapi .

Cung cấp file

Làm thế nào để ta phân phát file ? Câu hỏi hay! Hãy tạo cho mình một trang index.html mới:

<!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <meta name="viewport" content="width=device-width, initial-scale=1.0">   <meta http-equiv="X-UA-Compatible" content="ie=edge">   <title>hapi Todo List</title>   <style>   body {     background-color: #6624fb;     color: white;   }    .container {     display: flex;     height: 93vh;     justify-content: center;     flex-wrap: wrap;     flex-direction: column;     align-items: center;   }    .completed {     text-decoration: line-through;   }    ul {     padding: 0px;     margin: 0px;   }    li {     font-size: 24px;     list-style:none;   }   </style> </head> <body>   <div class="container">     <h1>Todo List</h1>     <ul>       <li class="completed">Learn about Hapi.js</li>       <li>Read more articles on Alligator.io</li>       <li>Drink less coffee</li>     </ul>   </div> </body> </html> 

Sau đó, ta có thể phục vụ điều này từ tuyến index (hoặc tuyến khác hoặc lựa chọn của bạn). Để thực hiện việc này, trước tiên ta cần cài đặt module inert được sử dụng để cung cấp các file tĩnh.

Rất may, ta đã học cách đăng ký plugin trong ứng dụng hapi của bạn ! Cài đặt inert bằng cách chạy phần sau trong terminal :

$ npm install inert 

Sau đó đăng ký inert như vậy:

const start = async () => {   /**      Note: You can also require inert as a variable like so:     const Inert = require('inert');      await server.register([Inert]);   **/   await server.register([consoleLogging, require('inert')]);    await server.start(); }; 

Khi ta chuyển đến / , ta không chỉ nhận được log bên trong console của bạn mà còn nhận được danh sách Todo :

Cung cấp các file  tĩnh với hapi

Tóm lược

Bây giờ ta chỉ biết đủ để cài đặt và chạy với hapi. Hãy theo dõi các bài viết tiếp theo sẽ xem xét các khái niệm được thảo luận bên trong bài viết này chi tiết hơn!

Bạn có thể tìm thấy mã cho bài viết này trong repo này


Tags:

Các tin liên quan