Tạo API NodeJS Express

Ứng dụng Express thường được sử dụng làm ứng dụng phụ trợ trong kiến ​​trúc máy khách-máy chủ trong khi ứng dụng khách có thể được viết bằng React. js hoặc một giải pháp lối vào phổ biến khác và máy chủ có thể được viết bằng Express. Cả hai thực thể dẫn đến kiến ​​trúc máy khách-máy chủ (mối quan hệ giao diện người dùng và phụ trợ) trong khi phần phụ trợ sẽ cần thiết cho (A) logic nghiệp vụ không được hiển thị dưới dạng mã nguồn cho ứng dụng giao diện người dùng -- nếu không, nó sẽ có thể truy cập được trong trình duyệt . g. (các) cơ sở dữ liệu)

Tuy nhiên, đừng nhầm ứng dụng khách luôn là giao diện người dùng và ứng dụng máy chủ luôn là phụ trợ tại đây. Những điều khoản này không thể được trao đổi một cách dễ dàng. Trong khi ứng dụng giao diện người dùng thường là thứ được nhìn thấy trong trình duyệt, thì phần phụ trợ thường thực hiện logic nghiệp vụ không được hiển thị trong trình duyệt và cũng thường kết nối với cơ sở dữ liệu

Frontend -> Backend -> Database

Nhưng ngược lại, các thuật ngữ máy khách và máy chủ là vấn đề về quan điểm. Ứng dụng phụ trợ (Phần cuối 1) sử dụng một ứng dụng phụ trợ khác (Phần cuối 2) trở thành ứng dụng khách (Phần cuối 1) cho ứng dụng máy chủ (Phần cuối 2). Tuy nhiên, cùng một ứng dụng phụ trợ (Backend 1) vẫn là máy chủ cho một ứng dụng khách khác là ứng dụng giao diện người dùng (Frontend)

Frontend -> Backend 1 -> Backend 2 -> Database

// Frontend: Client of Backend 1

// Backend 1: Server for Frontend, also Client of Backend 2

// Backend 2: Server for Backend 1

Nếu bạn muốn trả lời câu hỏi máy khách-máy chủ nếu ai đó hỏi bạn vai trò của một thực thể trong kiến ​​trúc máy khách-máy chủ, hãy luôn tự hỏi bản thân ai (máy chủ) đang phục vụ ai (máy khách) và ai (máy khách) sử dụng các chức năng (phụ trợ) của ai

Đó là lý thuyết đằng sau kiến ​​trúc máy khách-máy chủ và cách liên quan đến chúng. Hãy thực tế hơn một lần nữa. Các ứng dụng máy khách và máy chủ giao tiếp với nhau như thế nào? . Tuy nhiên, cái phổ biến nhất được gọi là REST được định nghĩa vào năm 2000 bởi Roy Fielding. Đó là một kiến ​​trúc tận dụng giao thức HTTP để cho phép giao tiếp giữa ứng dụng khách và ứng dụng máy chủ. Ứng dụng máy chủ cung cấp API REST còn được gọi là máy chủ RESTful. Các máy chủ không tuân theo kiến ​​trúc REST 100% được gọi là RESTish hơn là RESTful. Trong phần tiếp theo, chúng ta sẽ triển khai API REST như vậy cho ứng dụng máy chủ Express của mình, nhưng trước tiên, hãy tìm hiểu công cụ cho phép chúng ta tương tác với API REST

bài tập

  • Kiến trúc máy khách-máy chủ là gì?
  • Đọc thêm về API REST và các API khác

cURL cho API REST

Nếu bạn chưa nghe nói về cURL, phần này sẽ cung cấp cho bạn một cuộc thảo luận ngắn về cURL là gì và cách sử dụng nó để tương tác với API (REST). Định nghĩa được lấy từ Wikipedia cho biết. "Xoăn [. ] là một dự án phần mềm máy tính cung cấp thư viện và công cụ dòng lệnh để truyền dữ liệu bằng các giao thức khác nhau. " Vì REST là một kiến ​​trúc sử dụng HTTP, một máy chủ hiển thị API RESTful có thể được sử dụng bằng cURL, vì HTTP là một trong các giao thức khác nhau

Đầu tiên, hãy cài đặt nó một dòng lệnh. Hiện tại, hướng dẫn cài đặt dành cho người dùng MacOS, nhưng tôi đoán bằng cách tra cứu trực tuyến "curl for windows", bạn sẽ tìm thấy hướng dẫn cài đặt cho hệ điều hành mong muốn của mình (e. g. Windows) cũng vậy. Trong hướng dẫn này, chúng tôi sẽ sử dụng Homebrew để cài đặt nó. Nếu bạn chưa có Homebrew, hãy cài đặt nó bằng lệnh sau trên dòng lệnh

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Nếu bạn chưa từng nghe về Homebrew, hãy đọc thêm về nó tại đây. Tiếp theo, cài đặt cURL với Homebrew

brew install curl

Bây giờ, hãy khởi động máy chủ Express của bạn từ các phần trước. Sau khi ứng dụng của bạn được bắt đầu, hãy thực thi

Browser (Client) -> Express Server

cURL (Client) -> Express Server

3 trong một cửa sổ dòng lệnh khác. Đảm bảo cổng khớp với cổng của bạn và máy chủ Express đang chạy. Sau khi thực hiện lệnh, bạn sẽ thấy thông báo "Xin chào thế giới. " được in trên dòng lệnh. Xin chúc mừng, bạn vừa sử dụng máy chủ Express của mình với tư cách là máy khách với một thứ khác ngoài trình duyệt

Browser (Client) -> Express Server

cURL (Client) -> Express Server

Cho dù bạn truy cập ứng dụng Express của mình trên

Browser (Client) -> Express Server

cURL (Client) -> Express Server

4 trong trình duyệt hay qua dòng lệnh bằng cURL, bạn sẽ thấy cùng một kết quả. Cả hai công cụ đều đóng vai trò là ứng dụng khách trong khi ứng dụng Express là máy chủ của bạn. Bạn sẽ thấy trong các phần tiếp theo cách sử dụng cURL để xác minh API REST của ứng dụng Express mà chúng ta sẽ cùng nhau triển khai, trên dòng lệnh thay vì trong trình duyệt

bài tập

  • Làm quen với các thuật ngữ client/server và frontend/backend
  • Nếu bạn muốn có một giải pháp thay thế cho cURL hoạt động trong trình duyệt, hãy xem Postman hoặc Insomnia

Tuyến đường cao tốc. Phương thức HTTP là hoạt động REST

Express là một lựa chọn hoàn hảo cho máy chủ khi cần tạo và hiển thị API (e. g. REST API) để giao tiếp dưới dạng ứng dụng khách với ứng dụng máy chủ của bạn. Trước đây, bạn đã triển khai một tuyến đường Express, tuyến đường này sẽ gửi thông báo "Xin chào thế giới. ", mà bạn đã truy cập qua trình duyệt và cURL. Cuối cùng, hãy thiết lập nhiều tuyến đường hơn để chứa API RESTful cho ứng dụng Express của bạn. Thêm các tuyến sau vào ứng dụng Express của bạn trong khi bản thân URI không thay đổi, nhưng phương thức được sử dụng từ phiên bản Express của bạn

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

Mỗi phương thức của phiên bản Express ánh xạ tới một phương thức HTTP. Hãy xem cách nó hoạt động. Khởi động lại máy chủ Express của bạn trên dòng lệnh, nếu nó chưa chạy và thực hiện bốn lệnh cURL trong một cửa sổ dòng lệnh khác. Bạn sẽ thấy đầu ra sau cho các lệnh

________số 8

Theo mặc định, cURL sẽ sử dụng phương thức HTTP GET. Tuy nhiên, bạn có thể chỉ định phương thức HTTP bằng cờ

Browser (Client) -> Express Server

cURL (Client) -> Express Server

5 (hoặc cờ

Browser (Client) -> Express Server

cURL (Client) -> Express Server

6). Tùy thuộc vào phương thức HTTP mà bạn đang chọn, bạn sẽ truy cập các tuyến khác nhau của ứng dụng Express của mình -- ở đây chỉ đại diện cho một điểm cuối API duy nhất với một URI cho đến nay. Sau này, bạn sẽ thấy các phần bổ sung khác mà bạn có thể thêm vào các yêu cầu cURL của mình

Đó là một trong những khía cạnh quan trọng của REST. Nó sử dụng các phương thức HTTP để thực hiện các thao tác trên (các) URI. Thông thường, các thao tác này được gọi là thao tác CRUD cho các thao tác tạo, đọc, cập nhật và xóa. Tiếp theo, bạn sẽ thấy những hoạt động này được sử dụng trên các URI (tài nguyên) nào

bài tập

  • Xác nhận mã nguồn của bạn cho phần cuối cùng
    • Xác nhận các thay đổi của bạn từ phần trước
  • Đọc thêm về hoạt động CRUD
  • Tự mình thử thêm một số lệnh cURL trên dòng lệnh

Tuyến đường cao tốc. URI là Tài nguyên REST

Một khía cạnh quan trọng khác của REST là mọi URI hoạt động như một tài nguyên. Cho đến nay, bạn chỉ thao tác trên URI gốc với các thao tác CRUD của mình, thao tác này không thực sự đại diện cho tài nguyên trong REST. Ngược lại, một tài nguyên có thể là một tài nguyên người dùng, ví dụ. Thay đổi các tuyến đường được giới thiệu trước đó của bạn thành các tuyến đường sau

Frontend -> Backend 1 -> Backend 2 -> Database

// Frontend: Client of Backend 1

// Backend 1: Server for Frontend, also Client of Backend 2

// Backend 2: Server for Backend 1

1

Với cURL trên dòng lệnh của bạn, bạn có thể duyệt qua tài nguyên -- được đại diện bởi một URI

Browser (Client) -> Express Server

cURL (Client) -> Express Server

7 -- cung cấp tất cả các hoạt động CRUD thông qua các phương thức HTTP

Frontend -> Backend 1 -> Backend 2 -> Database

// Frontend: Client of Backend 1

// Backend 1: Server for Frontend, also Client of Backend 2

// Backend 2: Server for Backend 1

3

Bạn sẽ thấy kết quả tương tự như trước, nhưng lần này bạn đang thao tác trên tài nguyên người dùng. Ví dụ bạn muốn tạo user thì bạn nhấn vào URI sau

Frontend -> Backend 1 -> Backend 2 -> Database

// Frontend: Client of Backend 1

// Backend 1: Server for Frontend, also Client of Backend 2

// Backend 2: Server for Backend 1

4

Rõ ràng là chúng tôi chưa chuyển bất kỳ thông tin nào để tạo người dùng, tuy nhiên, điểm cuối API để tạo người dùng sẽ khả dụng ngay bây giờ. Thiếu một phần để tạo phương thức PUT HTTP (thao tác cập nhật) và phương thức XÓA HTTP (thao tác xóa) RESTful theo quan điểm của URI

Frontend -> Backend 1 -> Backend 2 -> Database

// Frontend: Client of Backend 1

// Backend 1: Server for Frontend, also Client of Backend 2

// Backend 2: Server for Backend 1

0

Để xóa hoặc cập nhật tài nguyên người dùng, bạn cần biết chính xác người dùng. Đó là nơi sử dụng số nhận dạng duy nhất. Trong các tuyến Express của chúng tôi, chúng tôi có thể chỉ định các số nhận dạng duy nhất với các tham số trong URI. Sau đó, hàm gọi lại giữ tham số của URI trong thuộc tính của đối tượng yêu cầu. Thử lại thao tác cURL trên

Browser (Client) -> Express Server

cURL (Client) -> Express Server

8,

Browser (Client) -> Express Server

cURL (Client) -> Express Server

9 hoặc mã định danh khác bằng phương thức XÓA hoặc CẬP NHẬT HTTP và xác minh rằng mã định danh hiển thị trong dòng lệnh dưới dạng đầu ra

bài tập

  • Xác nhận mã nguồn của bạn cho phần cuối cùng
    • Xác nhận các thay đổi của bạn từ phần trước
  • Cố gắng xóa hoặc cập nhật người dùng theo số nhận dạng bằng cURL
  • Đọc thêm về định tuyến cơ bản trong Express

Ý nghĩa của REST với Express

Có thể bạn vẫn đang thắc mắc. Giá trị nào mang lại sự kết hợp giữa các phương thức URI và HTTP -- tạo nên phần lớn triết lý REST -- cho ứng dụng của tôi?

Hãy tưởng tượng rằng chúng ta sẽ không chỉ trả về kết quả như hiện tại, mà thay vào đó sẽ hành động đúng với thao tác nhận được. Chẳng hạn, máy chủ Express có thể được kết nối với cơ sở dữ liệu lưu trữ các thực thể người dùng trong bảng người dùng. Bây giờ, khi sử dụng API REST với tư cách là khách hàng (e. g. cURL, trình duyệt hoặc cả React. js), bạn có thể truy xuất tất cả người dùng từ cơ sở dữ liệu bằng phương thức HTTP GET trên URI

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

0 hoặc, trên cùng một tài nguyên, tạo người dùng mới bằng phương thức HTTP POST

Frontend -> Backend 1 -> Backend 2 -> Database

// Frontend: Client of Backend 1

// Backend 1: Server for Frontend, also Client of Backend 2

// Backend 2: Server for Backend 1

1

Đột nhiên, bạn có thể đọc và ghi dữ liệu từ và tới cơ sở dữ liệu từ ứng dụng khách. Mọi thứ có thể thực hiện được là một ứng dụng phụ trợ cho phép bạn viết một giao diện (e. g. REST API) cho các hoạt động CRUD

Frontend -> Backend 1 -> Backend 2 -> Database

// Frontend: Client of Backend 1

// Backend 1: Server for Frontend, also Client of Backend 2

// Backend 2: Server for Backend 1

2

Trong khi điều quan trọng cần lưu ý là API REST thuộc về ứng dụng máy chủ

Frontend -> Backend 1 -> Backend 2 -> Database

// Frontend: Client of Backend 1

// Backend 1: Server for Frontend, also Client of Backend 2

// Backend 2: Server for Backend 1

3

Bạn luôn có thể tiến thêm một bước nữa bằng cách có nhiều ứng dụng máy chủ cung cấp API REST. Thường thì chúng đi kèm với tên microservice hoặc dịch vụ web trong khi mỗi ứng dụng máy chủ cung cấp chức năng được đóng gói tốt. Các máy chủ thậm chí không phải sử dụng cùng một ngôn ngữ lập trình vì chúng đang giao tiếp qua giao diện bất khả tri của ngôn ngữ lập trình (HTTP với REST). Mặc dù các giao diện (API) không nhất thiết phải là API REST cần thiết

Frontend -> Backend 1 -> Backend 2 -> Database

// Frontend: Client of Backend 1

// Backend 1: Server for Frontend, also Client of Backend 2

// Backend 2: Server for Backend 1

4

Hãy lấy mọi thứ chúng ta đã học trên lý thuyết, cho đến nay, tiến thêm một bước tới ứng dụng thực tế bằng cách gửi dữ liệu thực qua dây. Dữ liệu sẽ là dữ liệu mẫu, dữ liệu này sẽ chưa đến từ cơ sở dữ liệu mà thay vào đó sẽ được mã hóa cứng trong mã nguồn

Frontend -> Backend 1 -> Backend 2 -> Database

// Frontend: Client of Backend 1

// Backend 1: Server for Frontend, also Client of Backend 2

// Backend 2: Server for Backend 1

5

Bên cạnh các thực thể người dùng, chúng ta cũng sẽ có các thực thể tin nhắn. Cả hai thực thể đều có liên quan với nhau bằng cách cung cấp thông tin cần thiết dưới dạng định danh (e. g. một tin nhắn có một người tạo tin nhắn). Đó là cách một thông báo được liên kết với người dùng và cách bạn cũng sẽ truy xuất dữ liệu từ cơ sở dữ liệu, trong khi mỗi thực thể (người dùng, thông báo) có một bảng cơ sở dữ liệu chuyên dụng. Cả hai đều được biểu diễn dưới dạng các đối tượng có thể được truy cập bằng mã định danh

Hãy bắt đầu bằng cách cung cấp hai tuyến để đọc toàn bộ danh sách người dùng và một người dùng theo số nhận dạng

Frontend -> Backend 1 -> Backend 2 -> Database

// Frontend: Client of Backend 1

// Backend 1: Server for Frontend, also Client of Backend 2

// Backend 2: Server for Backend 1

6

Trong khi chúng tôi chọn một người dùng từ đối tượng theo mã định danh cho tuyến người dùng đơn lẻ, chúng tôi chuyển đổi đối tượng người dùng thành danh sách người dùng cho tuyến tất cả người dùng. Điều tương tự cũng có thể xảy ra đối với tài nguyên tin nhắn

Frontend -> Backend 1 -> Backend 2 -> Database

// Frontend: Client of Backend 1

// Backend 1: Server for Frontend, also Client of Backend 2

// Backend 2: Server for Backend 1

7

Tự mình thử tất cả bốn tuyến với cURL trên dòng lệnh. Đó chỉ là về đọc dữ liệu. Tiếp theo, chúng ta sẽ thảo luận về các hoạt động CRUD khác để tạo, cập nhật và xóa tài nguyên để thực sự ghi dữ liệu. Tuy nhiên, chúng tôi sẽ không đề cập đến phần mềm trung gian Express tùy chỉnh và phần mềm trung gian Express do hệ sinh thái Express cung cấp. Đó là lý do tại sao tiếp theo chúng ta sẽ thảo luận về chủ đề phần mềm trung gian Express trong khi triển khai các hoạt động CRUD còn thiếu

bài tập

  • Xác nhận mã nguồn của bạn cho phần cuối cùng
    • Xác nhận các thay đổi của bạn từ phần trước
  • Đọc thêm về REST
  • Đọc thêm về GraphQL như giải pháp thay thế phổ biến cho REST

Phần mềm trung gian Express cấp ứng dụng

Trước khi chúng tôi chuyển sang phần mềm trung gian Express một lần nữa, hãy xem cách một kịch bản tạo thông báo có thể được triển khai trong ứng dụng Express của chúng tôi. Vì chúng tôi đang tự tạo một tin nhắn mà không có cơ sở dữ liệu, chúng tôi cần một thư viện trợ giúp để tạo các số nhận dạng duy nhất cho chúng tôi. Cài đặt thư viện trợ giúp này trên dòng lệnh

Frontend -> Backend 1 -> Backend 2 -> Database

// Frontend: Client of Backend 1

// Backend 1: Server for Frontend, also Client of Backend 2

// Backend 2: Server for Backend 1

8

Tiếp theo, nhập nó ở đầu src/index của bạn. tập tin js

Frontend -> Backend 1 -> Backend 2 -> Database

// Frontend: Client of Backend 1

// Backend 1: Server for Frontend, also Client of Backend 2

// Backend 2: Server for Backend 1

9

Bây giờ, hãy tạo một tin nhắn với một tuyến đường mới sử dụng phương thức HTTP POST

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

0

Chúng tôi tạo một mã định danh duy nhất cho thư bằng thư viện mới, sử dụng nó làm thuộc tính trong đối tượng thư với khởi tạo thuộc tính đối tượng tốc ký, gán thư theo mã định danh trong đối tượng thư -- là cơ sở dữ liệu giả của chúng tôi -- và trả về

Tuy nhiên, một cái gì đó là mất tích cho tin nhắn. Để tạo một tin nhắn, khách hàng phải cung cấp chuỗi

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

1 cho tin nhắn. May mắn thay, phương thức HTTP POST cho phép gửi dữ liệu dưới dạng tải trọng trong phần thân. Đó là lý do tại sao chúng ta có thể sử dụng yêu cầu đến (

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

2) để trích xuất một trọng tải từ nó

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

1

Truy cập tải trọng của yêu cầu HTTP POST được cung cấp trong Express với phần mềm trung gian tích hợp dựa trên trình phân tích cú pháp nội dung. Nó cho phép chúng tôi chuyển đổi các loại cơ thể từ đối tượng yêu cầu của chúng tôi (e. g. json, được mã hóa url)

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2

Điều này trích xuất toàn bộ phần nội dung của luồng yêu cầu đến và làm cho nó có thể truy cập được trên

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

3. Giờ đây, nội dung có nội dung của thư có thể truy cập được trong yêu cầu cho dù nó được gửi bởi yêu cầu POST thông thường hay yêu cầu POST từ biểu mẫu HTML. Cả hai tùy chọn đều hoạt động vì tất cả dữ liệu sẽ được nhận và gửi dưới dạng tải trọng JSON ngay bây giờ. Đó là một khía cạnh khác của REST, bản thân nó không có ý kiến ​​gì về định dạng tải trọng (JSON, XML), nhưng một khi bạn đã chọn định dạng (ở đây là JSON), bạn nên tuân theo định dạng đó cho toàn bộ API của mình

Lưu ý rằng tất cả dữ liệu đi kèm với thẻ nội dung của đối tượng yêu cầu chưa được nhập. Mọi thứ xuất hiện dưới dạng chuỗi JSON. Trong trường hợp của tin nhắn là

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

1, chúng tôi sẽ ổn khi chỉ giữ nó dưới dạng một chuỗi. Tuy nhiên, đối với các loại khác, bạn sẽ phải chuyển đổi chuỗi JSON

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

3

Trong bước cuối cùng này, chúng tôi đã sử dụng phần mềm trung gian Express tích hợp sẵn và cung cấp phần mềm này ở cấp ứng dụng -- có nghĩa là mỗi yêu cầu đến một trong các tuyến Express của chúng tôi đều đi qua phần mềm trung gian. Do đó, tất cả dữ liệu do khách hàng gửi đến máy chủ của chúng tôi đều có sẵn trong phần thân của yêu cầu đến. Hãy thử nó bằng cách tự tạo một tin nhắn. Trong một yêu cầu cURL, bạn có thể chỉ định các tiêu đề HTTP với cờ

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

5 -- đó là cách chúng tôi nói rằng chúng tôi muốn chuyển JSON -- và dữ liệu dưới dạng tải trọng với cờ

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

6. Bạn sẽ có thể tạo tin nhắn theo cách này

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

4

Bạn sẽ thấy messaged đã tạo được trả về cho bạn trên dòng lệnh. Bạn có thể kiểm tra kỹ xem thư có thực sự được tạo trong đối tượng thư của bạn (còn gọi là cơ sở dữ liệu giả) hay không bằng cách thực hiện một yêu cầu cURL khác trên dòng lệnh

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

5

Ở đó bạn sẽ thấy tin nhắn mới đã được tạo cho bạn. Ngoài ra, bạn cũng có thể yêu cầu tin nhắn mới của mình theo số nhận dạng. Thực hiện yêu cầu cURL sau để nhận một thực thể thư, nhưng sử dụng số nhận dạng thư thực tế của bạn cho nó, vì số nhận dạng của tôi khác với số nhận dạng của bạn

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

6

Đó là nó. Bạn đã tạo tài nguyên (tin nhắn) đầu tiên của mình thông qua API REST và yêu cầu cùng một tài nguyên ((các) tin nhắn) từ API REST của bạn. Trên hết, bạn đã sử dụng phần mềm trung gian Express tích hợp sẵn để cung cấp dữ liệu trong đối tượng nội dung của yêu cầu

Cho đến nay, chúng tôi chỉ nhập phần mềm trung gian Express (CORS) của bên thứ ba hoặc sử dụng phần mềm trung gian Express tích hợp sẵn (bộ phân tích nội dung) -- cả hai đều ở cấp ứng dụng. Bây giờ, hãy tự xây dựng một phần mềm trung gian Express tùy chỉnh, phần mềm này cũng sẽ được sử dụng ở cấp ứng dụng. Bản thiết kế cho phần mềm trung gian tương tự như các chức năng của Express mà chúng ta đã thấy trước đây

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

7

Phần mềm trung gian chỉ là một hàm JavaScript có quyền truy cập vào ba đối số.

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

2,

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

8,

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

9. Bạn đã biết

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

2 và

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

8 -- chúng là đối tượng yêu cầu và phản hồi của chúng ta. Ngoài ra, chức năng tiếp theo sẽ được gọi để báo hiệu rằng phần mềm trung gian đã hoàn thành công việc của nó. Ở giữa chức năng phần mềm trung gian, bạn có thể làm bất cứ điều gì ngay bây giờ. Chúng ta có thể chỉ cần

curl http://localhost:3000

-> Received a GET HTTP method

curl -X POST http://localhost:3000

-> Received a POST HTTP method

curl -X PUT http://localhost:3000

-> Received a PUT HTTP method

curl -X DELETE http://localhost:3000

-> Received a DELETE HTTP method

2 thời gian hoặc làm điều gì đó với các đối tượng yêu cầu (

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

2) hoặc phản hồi (

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

8)

Trong trường hợp cụ thể của chúng tôi, khi tạo một tin nhắn trên tài nguyên tin nhắn, chúng tôi cần biết ai đang tạo tin nhắn để gán một

curl http://localhost:3000

-> Received a GET HTTP method

curl -X POST http://localhost:3000

-> Received a POST HTTP method

curl -X PUT http://localhost:3000

-> Received a PUT HTTP method

curl -X DELETE http://localhost:3000

-> Received a DELETE HTTP method

5 cho nó. Hãy tạo một phiên bản đơn giản của phần mềm trung gian xác định người dùng được xác thực giả đang gửi yêu cầu. Trong trường hợp sau, người dùng được xác thực là người dùng có mã định danh

curl http://localhost:3000

-> Received a GET HTTP method

curl -X POST http://localhost:3000

-> Received a POST HTTP method

curl -X PUT http://localhost:3000

-> Received a PUT HTTP method

curl -X DELETE http://localhost:3000

-> Received a DELETE HTTP method

6 được gán làm thuộc tính

curl http://localhost:3000

-> Received a GET HTTP method

curl -X POST http://localhost:3000

-> Received a POST HTTP method

curl -X PUT http://localhost:3000

-> Received a PUT HTTP method

curl -X DELETE http://localhost:3000

-> Received a DELETE HTTP method

7 cho đối tượng yêu cầu

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

8

Sau đó, bạn có thể lấy người dùng đã xác thực từ đối tượng yêu cầu và thêm nó làm trình tạo tin nhắn vào tin nhắn

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

9

Bạn có thể tưởng tượng làm thế nào phần mềm trung gian như vậy có thể được sử dụng sau này để chặn từng yêu cầu đến để xác định từ các tiêu đề HTTP đến xem yêu cầu có đến từ người dùng được xác thực hay không. Nếu yêu cầu đến từ một người dùng đã được xác thực, thì người dùng đó sẽ được chuyển đến mọi tuyến Express sẽ được sử dụng ở đó. Đó là cách máy chủ Express có thể không trạng thái trong khi máy khách luôn gửi thông tin của người dùng hiện được xác thực

Không trạng thái là một đặc điểm khác của các dịch vụ RESTful. Xét cho cùng, có thể tạo nhiều phiên bản máy chủ để cân bằng lưu lượng đến đồng đều giữa các máy chủ. Nếu trước đây bạn đã nghe nói về thuật ngữ cân bằng tải, thì đó chính xác là những gì được sử dụng khi bạn có nhiều máy chủ trong tay. Đó là lý do tại sao một máy chủ không nên giữ trạng thái (e. g. người dùng được xác thực) -- ngoại trừ trong cơ sở dữ liệu -- và khách hàng luôn phải gửi thông tin này cùng với mỗi yêu cầu. Sau đó, một máy chủ có thể có một phần mềm trung gian đảm nhiệm việc xác thực ở cấp độ ứng dụng và cung cấp trạng thái phiên (e. g. người dùng được xác thực) tới mọi tuyến đường trong ứng dụng Express của bạn

Bây giờ, bạn đã học được những điều cơ bản về phần mềm trung gian cấp ứng dụng trong Express, hãy triển khai các tuyến cuối cùng để hoàn thành các tuyến của ứng dụng của chúng ta. Còn thao tác xóa tin nhắn thì sao

brew install curl

0

Ở đây, chúng tôi đã sử dụng thuộc tính đối tượng động để loại trừ thư mà chúng tôi muốn xóa khỏi phần còn lại của đối tượng thư. Bạn có thể thử xác minh chức năng bằng lệnh cURL sau

brew install curl

1

Thao tác cập nhật trên tài nguyên tin nhắn các bạn tự thực hiện làm bài tập. Tôi sẽ dành nó cho phần sau, bởi vì nó nhanh chóng tạo ra một chủ đề mới. quyền. Câu hỏi. Ai được phép chỉnh sửa tin nhắn?

Cuối cùng, vì bạn đã có trong tay người dùng được xác thực giả do phần mềm trung gian trên toàn ứng dụng, bạn cũng có thể cung cấp một tuyến dành riêng cho tài nguyên này

brew install curl

2

Đây là lần đầu tiên bạn phá vỡ các quy tắc hoàn toàn RESTful, bởi vì bạn cung cấp một điểm cuối API cho một tính năng rất cụ thể. Đây không phải là lần đầu tiên bạn vi phạm luật của REST, bởi vì REST thường không được triển khai đầy đủ RESTful mà là RESTish. Nếu bạn muốn tìm hiểu sâu hơn về REST, bạn có thể tự làm điều đó. HATEOAS và các chủ đề liên quan đến REST khác không được đề cập chi tiết và triển khai tại đây

bài tập

  • Xác nhận mã nguồn của bạn cho phần cuối cùng
    • Xác nhận các thay đổi của bạn từ phần trước
  • Đọc thêm về cách sử dụng phần mềm trung gian trong Express
    • Tập trung vào phần mềm trung gian cấp ứng dụng, phần mềm trung gian tích hợp và phần mềm trung gian của bên thứ ba
  • Đọc thêm về cách viết phần mềm trung gian trong Express

Các mô hình mô-đun trong Express dưới dạng nguồn dữ liệu

Hiện tại, tất cả triển khai của chúng tôi nằm trong src/index. tập tin js. Tuy nhiên, tại một số điểm, bạn có thể muốn mô đun hóa các chi tiết triển khai của mình và đưa chúng vào các tệp và thư mục chuyên dụng trong khi src/index. js chỉ nên quan tâm đến việc đặt mọi thứ lại với nhau và khởi động ứng dụng. Trước khi chúng tôi đi sâu vào mô đun hóa định tuyến, trước tiên hãy xem cách chúng tôi có thể mô đun hóa dữ liệu mẫu của mình trong cái gọi là mô hình. Từ thư mục gốc của bạn, gõ các lệnh sau để tạo cấu trúc thư mục/tệp cho các mô hình

brew install curl

3

Thư mục mô hình trong ứng dụng Express thường là nơi bạn xác định nguồn dữ liệu của mình. Trong trường hợp của chúng tôi, đó là dữ liệu mẫu, nhưng trong các ứng dụng khác chẳng hạn, nó sẽ là giao diện với cơ sở dữ liệu. Trong trường hợp tái cấu trúc của chúng tôi, hãy chuyển dữ liệu mẫu của chúng tôi sang src/models/index mới. tập tin js

brew install curl

4

Xóa dữ liệu mẫu sau đó trong src/index. tập tin js. Đồng thời nhập các mô hình trong src/index. js ngay bây giờ và chuyển chúng trong phần mềm trung gian cấp ứng dụng tùy chỉnh của chúng tôi tới tất cả các tuyến thông qua một đối tượng ngữ cảnh chuyên dụng. Đó là nơi cũng có thể đặt người dùng (được xác thực) của người dùng

curl http://localhost:3000

-> Received a GET HTTP method

curl -X POST http://localhost:3000

-> Received a POST HTTP method

curl -X PUT http://localhost:3000

-> Received a PUT HTTP method

curl -X DELETE http://localhost:3000

-> Received a DELETE HTTP method

7. Bạn không nhất thiết cần đối tượng bối cảnh làm vùng chứa, nhưng tôi thấy rằng nên giữ mọi thứ được chuyển đến các tuyến đường tại một nơi

brew install curl

5

Sau đó, thay vì có quyền truy cập vào dữ liệu mẫu trong tất cả các tuyến từ các biến bên ngoài như trước đây -- đây là tác dụng phụ không cần thiết và không giữ cho chức năng thuần túy --, chúng tôi muốn sử dụng các mô hình (và người dùng được xác thực) từ

brew install curl

6

Hiện chúng tôi đang sử dụng phần mềm trung gian trên toàn ứng dụng để chuyển các mô hình tới tất cả các tuyến của chúng tôi trong một đối tượng ngữ cảnh. Các mô hình đang tồn tại bên ngoài src/index. js và có thể được cấu trúc lại thành giao diện cơ sở dữ liệu thực tế sau này. Tiếp theo, vì chúng tôi đã tạo định tuyến độc lập với tất cả các tác dụng phụ và chuyển mọi thứ cần thiết cho chúng thông qua đối tượng yêu cầu với đối tượng ngữ cảnh, chúng tôi cũng có thể di chuyển các tuyến đến các vị trí riêng biệt

bài tập

  • Xác nhận mã nguồn của bạn cho phần cuối cùng
    • Xác nhận các thay đổi của bạn từ phần trước

Định tuyến theo mô-đun với Bộ định tuyến tốc hành

Cho đến nay, bạn đã gắn các tuyến trực tiếp trên phiên bản ứng dụng Express trong src/index. tập tin js. Điều này cuối cùng sẽ trở nên dài dòng, bởi vì tệp này chỉ nên quan tâm đến tất cả các chủ đề quan trọng để bắt đầu ứng dụng của chúng tôi. Nó không nên tiết lộ chi tiết thực hiện của các tuyến đường. Bây giờ, cách tốt nhất là di chuyển các tuyến đường vào cấu trúc tệp/thư mục chuyên dụng của chúng. Đó là lý do tại sao chúng tôi muốn cung cấp cho mỗi tài nguyên REST tệp riêng của chúng trong một thư mục chuyên dụng. Từ thư mục gốc của bạn, nhập dòng lệnh sau vào dòng lệnh để tạo cấu trúc thư mục/tệp cho các tuyến mô-đun

brew install curl

7

Sau đó, giả sử rằng các tuyến đã được xác định, hãy nhập tất cả các tuyến mô-đun vào src/index. js và sử dụng chúng để gắn kết chúng dưới dạng các tuyến mô-đun. Mỗi tuyến mô-đun nhận được một URI mà trong REST là tài nguyên của chúng tôi

brew install curl

8

Trong src/routes/index của chúng tôi. js vào mô-đun tuyến đường, nhập tất cả các tuyến đường từ các tệp chuyên dụng của chúng (chưa được xác định) và xuất chúng dưới dạng một đối tượng. Sau đó, chúng có sẵn trong src/index. js vì chúng tôi đã sử dụng chúng

brew install curl

9

Bây giờ hãy triển khai từng tuyến mô-đun. Bắt đầu với tuyến phiên trong src/routes/session. js chỉ trả về người dùng được xác thực giả. Express cung cấp Bộ định tuyến Express để tạo các tuyến mô-đun như vậy mà không cần gắn chúng trực tiếp vào phiên bản ứng dụng Express. Đó là cách chúng ta có thể tạo các tuyến đường mô-đun ở những nơi khác ngoài ứng dụng Express, nhưng nhập chúng sau để được gắn trên phiên bản của ứng dụng Express như chúng ta đã thực hiện ở bước trước

Browser (Client) -> Express Server

cURL (Client) -> Express Server

0

Tiếp theo, định tuyến người dùng trong src/routes/user. tập tin js. Nó khá giống với session route

Browser (Client) -> Express Server

cURL (Client) -> Express Server

1

Lưu ý rằng chúng ta không cần xác định URI

import 'dotenv/config';

...

import express from 'express';

const app = express();

...

app.get('/', (req, res) => {

return res.send('Received a GET HTTP method');

});

app.post('/', (req, res) => {

return res.send('Received a POST HTTP method');

});

app.put('/', (req, res) => {

return res.send('Received a PUT HTTP method');

});

app.delete('/', (req, res) => {

return res.send('Received a DELETE HTTP method');

});

app.listen(process.env.PORT, () =>

console.log(`Example app listening on port ${process.env.PORT}!`),

);

0 (đường dẫn) mà chỉ xác định các đường dẫn con, bởi vì chúng ta đã làm điều này trong quá trình cài đặt tuyến đường trong ứng dụng Express (xem src/index. tập tin js). Tiếp theo, triển khai src/routes/message. js để xác định tuyến đường mô-đun cuối cùng của chúng tôi

Browser (Client) -> Express Server

cURL (Client) -> Express Server

2

Mỗi tuyến mô-đun của chúng tôi từ Bộ định tuyến nhanh được gắn vào ứng dụng Express của chúng tôi bằng một URI chuyên dụng trong src/index. tập tin js bây giờ. Các tuyến mô-đun trong thư mục src/routes chỉ quan tâm đến các đường dẫn phụ và chi tiết triển khai của chúng trong khi gắn kết trong src/index. js quản lý đường dẫn chính và tuyến mô-đun được gắn kết được sử dụng ở đó. Cuối cùng, đừng quên xóa tất cả các route đã sử dụng trước đó mà chúng ta đã chuyển sang thư mục src/routes/ trong src/index. tập tin js

Làm cách nào để tạo API trong Express và Node?

Tạo một tệp mới có tên book-api. js. const express = require('express') const bodyParser = require('body-parser'); . sử dụng(cors());

Tôi có thể tạo API bằng Express js không?

Sử dụng Express cho nút. js để xây dựng API RESTful . Tạo và định cấu hình phần mềm trung gian để thêm những thứ như ghi nhật ký, xác thực và ủy quyền cũng như các công nghệ phát triển web khác.

Làm cách nào để tạo API trong nút js express bằng MySQL?

Đầu tiên, chúng ta cần tạo một thư mục cho dự án của mình bằng lệnh bên dưới. .
mkdir rest-with-mysql && cd rest-with-mysql Tạo thư mục mới cho dự án
npm init -y Khởi tạo một nút mới. dự án js
npm cài đặt express MySQL cors Cài đặt Cors
cấu trúc ứng dụng