NodeJS xây dựng API REST

TL;DR. Trong bài viết này, bạn sẽ tìm hiểu cách phát triển API RESTful với Node. js, Express và Auth0. Bạn sẽ bắt đầu lại từ đầu, xây dựng một Node mới. js, thì bạn sẽ thực hiện tất cả các bước cần thiết để xây dựng một API an toàn. Bạn có thể kiểm tra mã đầy đủ được phát triển trong suốt bài viết này trong kho lưu trữ GitHub này

"Tìm hiểu cách phát triển và bảo mật API RESTful một cách dễ dàng bằng cách sử dụng Node. js, Express và Auth0. "

NodeJS xây dựng API REST

Tweet cái này đi

điều kiện tiên quyết

Để theo dõi bài viết này, bạn sẽ cần có kiến ​​thức trước về JavaScript. Nếu bạn chưa từng sử dụng JavaScript trước đây (ngay cả khi phát triển giao diện người dùng), bạn có thể không hiểu rõ bài viết và bạn nên tìm hiểu về nó trước. Nếu bạn đã có kinh nghiệm với JavaScript trước đây, nhưng bạn chưa sử dụng Node. js, đừng lo lắng, bạn sẽ không gặp khó khăn gì ở đây. Mặc dù sẽ là lý tưởng nếu bạn biết một chút về Node. js, bạn sẽ thấy mã và các khái niệm được giải thích trong bài viết này không phức tạp

Ngoài ra, bạn sẽ cần phải có Node. js và NPM được cài đặt trong máy của bạn. Nếu bạn không có những thứ này, vui lòng làm theo hướng dẫn ở đây

Những gì bạn sẽ xây dựng

Như đã đề cập trước đây, trong bài viết này, bạn sẽ bắt đầu lại từ đầu (tôi. e. , từ một thư mục trống), thì bạn sẽ thực hiện tất cả các bước cần thiết để xây dựng một API RESTful an toàn. API mà bạn sẽ xây dựng sẽ cho phép các máy khách (ứng dụng của bên thứ ba) đưa ra các yêu cầu để thao túng tài nguyên. Trong trường hợp này, các tài nguyên sẽ đại diện cho các quảng cáo (như trong các sản phẩm hoặc dịch vụ được quảng cáo) mà người dùng sẽ tạo, truy xuất, cập nhật và xóa

Nếu bạn không biết API RESTful là gì hoặc thuật ngữ này viết tắt của từ gì, hãy xem định nghĩa và giải thích ngắn gọn về API RESTful này

API RESTful là Giao diện lập trình ứng dụng (API) sử dụng các động từ HTTP như

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
4,
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
5,
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
6 và
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
7 để vận hành dữ liệu. Còn được gọi là các dịch vụ web RESTful, API RESTful dựa trên phương pháp Chuyển giao trạng thái đại diện (REST), một kiểu kiến ​​trúc cho phép các nhà phát triển thao tác dữ liệu

Để biết thêm thông tin, hãy kiểm tra các tài nguyên sau

  • Chuyển trạng thai biểu hiện
  • Người mẫu trưởng thành của Richardson

Xây dựng và bảo mật API RESTful

Bây giờ bạn đã biết mình sẽ tạo gì và điều kiện tiên quyết là gì, đã đến lúc bắt đầu xây dựng ứng dụng của bạn. Để bắt đầu, hãy mở một thiết bị đầu cuối, di chuyển nó đến thư mục mà bạn thường tạo các dự án của mình và tạo một thư mục mới ở đó

mkdir express-ads-api

Sau đó, di chuyển vào thư mục mới này và sử dụng

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
8 để tạo một dự án mới

npm init -y

Lệnh trên sẽ dàn dựng dự án với một số thuộc tính mặc định. Nếu bạn mở thư mục này trong một trình soạn thảo văn bản hoặc trong một IDE (như Visual Studio Code hoặc WebStorm), bạn sẽ thấy lệnh

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
8 mà bạn đưa ra đã tạo một tệp có tên là
mkdir src
0. Mở tệp này, bạn sẽ thấy nội dung sau

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

Ngay bây giờ, tệp này khá ngắn và không có nhiều thông tin thú vị (nó chỉ hiển thị một số thuộc tính như dự án

mkdir src
1,
mkdir src
2 và
mkdir src
3). Tuy nhiên, khi bạn bắt đầu thêm các phụ thuộc vào dự án của mình, xu hướng là tệp này sẽ phát triển và trở nên thú vị hơn

Tiếp theo, bạn sẽ tạo một thư mục mới có tên là

mkdir src
4 bên trong thư mục gốc của dự án

________số 8

Ý tưởng ở đây là đặt tất cả mã nguồn của bạn (i. e. , các tệp JavaScript) bên trong thư mục này. Vì vậy, sau khi tạo thư mục này, hãy tạo một tệp mới có tên

mkdir src
5 bên trong nó và thêm đoạn mã sau vào đó

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
6

Sau khi lưu tệp này, bạn có thể quay lại thiết bị đầu cuối của mình và đưa ra lệnh sau để kiểm tra tệp (đảm bảo bạn đang ở gốc dự án)

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
7

Nếu mọi thứ hoạt động như mong đợi, bạn sẽ thấy "Xin chào, thế giới. " được in ra trong thiết bị đầu cuối của bạn

NodeJS xây dựng API REST

Tạo API Express đầu tiên của bạn

Ngay bây giờ, dự án bạn đã tạo chỉ ghi một thông báo tĩnh. Vì điều này không hữu ích lắm, sau khi xây dựng "Xin chào, thế giới" của bạn. " ứng dụng với Node. js, bạn có thể bắt đầu tập trung vào việc tạo API RESTful. Đối với điều đó, điều đầu tiên bạn cần là cài đặt một số phụ thuộc. Vì vậy, hãy đến thiết bị đầu cuối của bạn và đưa ra lệnh sau

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
8

Lệnh này sẽ cài đặt năm phụ thuộc trong dự án của bạn

  • mkdir src
    6. Bạn sẽ sử dụng phần phụ thuộc này để chuyển đổi nội dung của các yêu cầu đến thành các đối tượng JavaScript
  • mkdir src
    7. Bạn sẽ sử dụng phần phụ thuộc này để định cấu hình Express nhằm thêm các tiêu đề cho biết rằng API của bạn chấp nhận các yêu cầu đến từ các nguồn gốc khác. Điều này được gọi là Chia sẻ tài nguyên nguồn gốc chéo (CORS)
  • mkdir src
    8. Đây là thư viện Express
  • mkdir src
    9. Thư viện này giúp bảo mật API Express bằng cách xác định các tiêu đề HTTP khác nhau
  • {
      "name": "express-ads-api",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    60. Thư viện này thêm một số khả năng ghi nhật ký vào API Express của bạn

Ghi chú. Sau khi thực hiện lệnh trên, bạn sẽ nhận thấy hai điều trong dự án của mình. Đầu tiên, tệp

mkdir src
0 sẽ chứa một thuộc tính mới có tên là
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
62 với tất cả các thư viện ở trên. Đây là cách NPM biết dự án của bạn cần những phụ thuộc nào. Thứ hai, bạn sẽ nhận thấy một tệp mới có tên là
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
63 bên trong thư mục gốc của dự án. Tệp này giúp NPM xác định đâu là thư viện chính xác mà bạn đã sử dụng khi phát triển, vì vậy nó sử dụng cùng một thư viện ở mọi nơi (i. e. , trong các môi trường khác)

Khi NPM hoàn tất cài đặt các phụ thuộc này (có thể mất vài giây, tùy thuộc vào kết nối internet của bạn), bạn có thể mở tệp

mkdir src
5 và thay thế mã của nó bằng mã sau

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
8

Phiên bản mới của tệp này bắt đầu bằng cách nhập tất cả các phụ thuộc mà bạn đã cài đặt lúc trước, trải qua quá trình tạo và cấu hình ứng dụng Express mới (

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
65) và kết thúc bằng cách làm cho ứng dụng này lắng nghe trên cổng
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
66 (
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
67). Bên cạnh đó, mã này xác định hai điều quan trọng

  • một mảng có tên là
    {
      "name": "express-ads-api",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    68 tạm thời hoạt động như một cơ sở dữ liệu trong bộ nhớ (bạn sẽ sớm thay thế mảng này);
  • và một điểm cuối lắng nghe các yêu cầu HTTP
    {
      "name": "express-ads-api",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    4 và khi được kích hoạt, nó sẽ trả về tất cả nội dung của mảng
    {
      "name": "express-ads-api",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    68

Ghi chú. Đoạn mã trên chứa các nhận xét có thể giúp bạn hiểu từng dòng. Nếu bạn muốn tìm hiểu thêm về phần mềm trung gian đang được sử dụng (i. e. , khoảng

mkdir src
9,
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
72,
mkdir src
7 và
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
60), vui lòng tham khảo tài liệu chính thức của họ

Sau khi cập nhật tệp này, bạn có thể phát hành lại

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
75 từ thư mục gốc của dự án. Sau đó, trong một thiết bị đầu cuối khác, bạn có thể sử dụng
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
76 để đưa ra yêu cầu HTTP để kiểm tra API của mình

mkdir express-ads-api
1

Ghi chú. Nếu không có động từ nào được cấu hình rõ ràng (thông qua tham số

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
77), lệnh
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
76 sẽ đưa ra yêu cầu HTTP
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
4

Nếu muốn, bạn cũng có thể sử dụng ứng dụng khách HTTP đồ họa như Insomnia hoặc Postman. Ví dụ: ảnh chụp màn hình bên dưới hiển thị Mất ngủ sau khi đưa ra yêu cầu tới API Express

NodeJS xây dựng API REST

Bất kể bạn quyết định đưa ra yêu cầu như thế nào, sau khi nhận được yêu cầu, ứng dụng sẽ ủy quyền yêu cầu này cho điểm cuối

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
80. Sau đó, như đã định nghĩa, điểm cuối sẽ gửi lại cho máy khách phản hồi sau (i. e. , mảng
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
68)

mkdir express-ads-api
7

Tích hợp Express và MongoDB

Khi nói đến cơ sở dữ liệu, sự lựa chọn phổ biến nhất giữa các Node. js (cho đến nay) là MongoDB. Công cụ cơ sở dữ liệu này cho phép các nhà phát triển sử dụng mô hình dữ liệu tài liệu linh hoạt hoạt động đặc biệt tốt với Node. ứng dụng js. Như bạn sẽ thấy trong suốt bài viết, thao tác cơ sở dữ liệu MongoDB từ một Nút. ứng dụng js dễ dàng và hiệu quả

Tuy nhiên, trước khi tìm hiểu về cách làm cho API Express của bạn vận hành MongoDB, bạn sẽ cần một phiên bản cơ sở dữ liệu. Vì vậy, bạn có một số tùy chọn như cài đặt MongoDB trong máy của mình, chạy nó trong vùng chứa hoặc sử dụng nhà cung cấp đám mây như MongoDB Atlas. Tuy nhiên, để tạo thuận lợi cho quá trình này, bạn sẽ sử dụng một gói có tên là

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
82 để khởi tạo một phiên bản MongoDB theo chương trình để thử nghiệm hoặc mô phỏng trong quá trình phát triển. Điều thú vị về thư viện này là theo mặc định, nó chứa dữ liệu trong bộ nhớ. Ngoài ra, bạn sẽ cài đặt gói NPM
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
83 chính thức để làm cho ứng dụng của bạn tương tác với cơ sở dữ liệu trong bộ nhớ này

Vì vậy, hãy quay lại thiết bị đầu cuối của bạn, sử dụng

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
8 để cài đặt các gói này

npm init -y
0

Sau khi cài đặt chúng, hãy tạo một thư mục mới có tên là

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
85 bên trong thư mục
mkdir src
4 và bên trong đó, tạo một tệp mới có tên là
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
87. Bên trong tệp này, thêm đoạn mã sau

npm init -y
1

Như bạn có thể thấy, tệp này

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
88 có hai chức năng. Một để khởi tạo cơ sở dữ liệu trong bộ nhớ (
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
89) và một để trả về một tham chiếu đến nó (
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
80)

Với điều đó, hãy tạo một tệp mới có tên là

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
81 bên trong thư mục
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
85 và thêm đoạn mã sau vào đó

npm init -y
2

Tệp

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
81 cũng đang xác định và xuất hai hàm. Tuy nhiên, sự khác biệt là tệp này xuất một chức năng cho phép bạn chèn quảng cáo vào cơ sở dữ liệu (
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
84) và một chức năng truy xuất tất cả các bản ghi vẫn tồn tại ở đó (
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
85). Lưu ý rằng cả hai hàm này đều sử dụng hàm
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
80 do tệp
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
87 xuất để lấy tham chiếu trỏ đến cơ sở dữ liệu trong bộ nhớ của bạn

Sau khi tạo tệp này, hãy mở tệp

mkdir src
5 và cập nhật nó như sau

npm init -y
3

Với việc tái cấu trúc này, bạn là

  • nhập và gọi hàm
    {
      "name": "express-ads-api",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    89 để khởi tạo phiên bản trong bộ nhớ trước khi khiến API Express lắng nghe các yêu cầu;
  • nhập và gọi hàm
    {
      "name": "express-ads-api",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    84 để tạo quảng cáo mới ngay sau khi bắt đầu cơ sở dữ liệu;
  • và nhập và gọi
    {
      "name": "express-ads-api",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    85 bên trong điểm cuối chịu trách nhiệm về các yêu cầu
    {
      "name": "express-ads-api",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    4

Lưu ý rằng bạn đang thay thế việc triển khai trước đó của điểm cuối

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
4 để ngừng trả về mảng tĩnh
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
68 và bắt đầu trả về các bản ghi có sẵn bên trong cơ sở dữ liệu. Như vậy, bạn có thể bỏ dòng xác định hằng số
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
68

Khi hoàn tất việc tái cấu trúc, bạn có thể dừng API của mình (bằng cách nhấn vào

mkdir express-ads-api
16 +
mkdir express-ads-api
17), bắt đầu lại (
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
75) và đưa ra yêu cầu HTTP giống như trước đây (
mkdir express-ads-api
19). Sự khác biệt là bây giờ, API của bạn sẽ phản hồi bằng một mảng chứa một đối tượng có hai thuộc tính.
mkdir express-ads-api
70 (giống như trước đây) và
mkdir express-ads-api
71 (đề cập đến khóa chính của nó trên cơ sở dữ liệu)

NodeJS xây dựng API REST

Thêm điểm cuối để cho phép khách hàng chèn, cập nhật và xóa tài nguyên

Bây giờ bạn đã tích hợp API Express với MongoDB, đã đến lúc triển khai các động từ HTTP khác (tôi. e. , các điểm cuối khác). Trong phần này, bạn sẽ thêm ba điểm cuối mới vào API của mình

  • một điểm cuối chịu trách nhiệm cho các yêu cầu
    {
      "name": "express-ads-api",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    6. điều này sẽ cho phép khách hàng sử dụng API của bạn để lưu quảng cáo mới;
  • một điểm cuối chịu trách nhiệm cho các yêu cầu của
    {
      "name": "express-ads-api",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    7. điều này sẽ cho phép khách hàng xóa quảng cáo khỏi API của bạn;
  • một điểm cuối chịu trách nhiệm cho các yêu cầu của
    {
      "name": "express-ads-api",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    5. điều này sẽ cho phép khách hàng cập nhật các quảng cáo hiện có;

Để thêm các điểm cuối này, bạn sẽ bắt đầu bằng cách xác định các chức năng sẽ tương tác với phiên bản MongoDB của bạn. Vì vậy, hãy mở tệp

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
81 (tệp này nằm trong thư mục
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
85) và cập nhật nó như sau

npm init -y
4

Ở đây, bạn chỉ thêm hai chức năng mới (

mkdir express-ads-api
77 và
mkdir express-ads-api
78) bởi vì bạn đã có một chức năng cho phép chèn quảng cáo mới (
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
84). Lưu ý rằng cả hai hàm mới đều cần một phần tử có tên là
npm init -y
00 để có thể cho cơ sở dữ liệu biết bạn muốn cập nhật hoặc xóa phần tử cụ thể nào

Một điều quan trọng khác cần nắm bắt là đối tượng được chuyển đến thuộc tính

npm init -y
01 trong hoạt động
npm init -y
02. Trong khi cập nhật tài liệu trong cơ sở dữ liệu MongoDB, bạn chỉ có thể thông báo các thuộc tính đã thay đổi và bỏ qua bất kỳ thuộc tính nào vẫn giữ nguyên. Ví dụ: nếu bạn có một đối tượng trong cơ sở dữ liệu của mình với các trường có tên là
mkdir src
1,
npm init -y
04 và
npm init -y
05, thì bạn chỉ có thể chuyển đến
npm init -y
01 thuộc tính
npm init -y
04 để thay đổi nó trong khi không động đến phần còn lại. Nếu điều này vẫn chưa rõ ràng, bạn sẽ thấy điều này đang hoạt động trong giây lát

Sau khi cấu trúc lại tệp này, bạn sẽ phải mở tệp

mkdir src
5 và cập nhật nó như sau

npm init -y
5

Trên phiên bản mới của tệp này, bạn đang thêm các điểm cuối chịu trách nhiệm cho ba động từ HTTP được đề cập trước đó (

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
6,
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
7 và
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
5). Điều quan trọng cần lưu ý ở đây là bạn đang sử dụng tham số Express route để có thể tìm nạp, từ URL được yêu cầu, ________ 612 của quảng cáo mà bạn muốn xóa hoặc cập nhật (________ 613). Ngoài ra, như bạn có thể thấy trên cả hai điểm cuối
npm init -y
14 và
npm init -y
15, bạn sẽ nhận được thông tin chi tiết về quảng cáo được chèn hoặc cập nhật từ nội dung yêu cầu (
npm init -y
16)

Sau khi thay đổi tệp này, bạn có thể dừng API của mình (bằng cách nhấn

mkdir express-ads-api
16 +
mkdir express-ads-api
17), bắt đầu lại (
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
75) và đưa ra một số yêu cầu HTTP (như được trình bày trong đoạn mã sau) để kiểm tra các điểm cuối mới

npm init -y
6

Ghi chú. Nếu bạn đang sử dụng đoạn mã ở trên, ngay sau khi chèn quảng cáo mới, bạn đang đưa ra yêu cầu để tất cả quảng cáo được duy trì trên cơ sở dữ liệu. Sử dụng kết quả của yêu cầu này để sao chép thuộc tính

mkdir express-ads-api
71 của quảng cáo mới và sử dụng nó để thay thế trình giữ chỗ
npm init -y
21

Nếu mọi thứ hoạt động như mong đợi, yêu cầu đầu tiên sẽ duy trì một quảng cáo mới trong API của bạn, yêu cầu thứ hai sẽ trả về tất cả các quảng cáo được duy trì ở đó, yêu cầu thứ ba sẽ cập nhật giá của quảng cáo mới (từ

npm init -y
22 đến
npm init -y
23) và yêu cầu thứ tư

Trên yêu cầu

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
5, bạn có thể thấy rằng bạn chỉ chuyển một trường trên nội dung yêu cầu (
npm init -y
25). Vì đối tượng
npm init -y
01 được chuyển cho hoạt động
npm init -y
02 đang sử dụng chính phần thân này để cập nhật quảng cáo, nên
mkdir express-ads-api
70 của quảng cáo (là "Pizza") sẽ không bị thay đổi. Gọn gàng, phải không?

Bảo mật API Express với Auth0

Hiện tại, bạn có API Express hiển thị các điểm cuối cho phép khách hàng chèn, cập nhật, xóa và truy xuất quảng cáo. Đây là một khởi đầu tốt, nhưng bạn có thể sử dụng một số bảo mật, phải không?

Ví dụ: giả sử bạn muốn cho phép tất cả người dùng (bất kể họ là khách truy cập hay họ được xác thực) liệt kê quảng cáo, nhưng bạn chỉ muốn những người dùng được xác thực mới có thể chèn, cập nhật và xóa đối tượng. Bạn sẽ làm điều này như thế nào?

Như bạn sẽ thấy trong phần này, việc bảo mật API Express bằng Auth0 rất dễ dàng. Để bắt đầu, bạn sẽ cần đăng ký Auth0 để có thể tích hợp nó vào API của mình. Nếu bạn đã có một tài khoản hiện tại, bạn có thể sử dụng nó mà không gặp vấn đề gì. Nếu bạn chưa có, bây giờ là thời điểm tốt để đăng ký tài khoản Auth0 miễn phí. Điều thú vị về Auth0 là với tài khoản miễn phí của mình, bạn sẽ có quyền truy cập vào các tính năng sau

  • Khóa cho Web, iOS và Android
  • Tối đa 2 nhà cung cấp nhận dạng xã hội (như Twitter và Facebook)
  • Quy tắc máy chủ không giới hạn
  • Sự đóng góp cho cộng đồng

Dùng thử miễn phí nền tảng xác thực mạnh mẽ nhất. Bắt đầu →

Sau khi đăng ký, bạn sẽ phải tạo API Auth0 để đại diện cho dự án Express của mình. Vì vậy, hãy chuyển đến phần API trên Bảng điều khiển Auth0 của bạn và nhấp vào nút Tạo API. Khi bạn nhấp vào nút này, Auth0 sẽ hiển thị cho bạn một hộp thoại trong đó nó sẽ hỏi bạn ba điều

  • Tên. Tên thân thiện cho API của bạn. Vì giá trị này chỉ được sử dụng bên trong Bảng điều khiển Auth0, đừng lo lắng nhiều về giá trị này (e. g. , bạn có thể sử dụng nội dung nào đó như "Hướng dẫn về API nhanh")
  • định danh. Mã định danh logic cho API bạn đang tạo. Vì Auth0 khuyên bạn nên sử dụng giá trị giống như URL, bạn có thể thêm một cái gì đó như
    npm init -y
    29 tại đây (mặc dù giá trị này trông giống như một URL, nhưng Auth0 sẽ không bao giờ gọi nó)
  • Thuật toán ký. Để bộ này thành
    npm init -y
    30

Sau khi điền vào biểu mẫu này, nhấp vào nút Tạo. Sau đó, quay lại thiết bị đầu cuối, đưa ra lệnh sau

npm init -y
7

Tại đây, bạn đang cài đặt hai thư viện mới

  • npm init -y
    31. Phần mềm trung gian xác thực Mã thông báo Web JSON (JWT) và đặt
    npm init -y
    32 với các thuộc tính của nó
  • npm init -y
    33. Một thư viện để truy xuất các khóa công khai RSA từ điểm cuối JWKS (Bộ khóa web JSON)

Sau đó mở file

npm init -y
34 và import các thư viện này như sau

npm init -y
8

Vẫn trên tệp này, hãy tạo hằng số sau (

npm init -y
35) ngay trước điểm cuối
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
6 (
npm init -y
37)

npm init -y
9

Hằng số này thực sự là một phần mềm trung gian Express sẽ xác thực mã thông báo truy cập. Lưu ý rằng, để làm cho nó hoạt động, bạn sẽ phải thay thế trình giữ chỗ

npm init -y
38 bằng mã định danh của API Auth0 mà bạn đã tạo (e. g. ,
npm init -y
29). Ngoài ra, bạn sẽ phải thay thế
npm init -y
40 bằng tên miền Auth0 của mình (e. g. ,
npm init -y
41)

Ghi chú. Bạn không chắc tên miền Auth0 của mình là gì? . Tên này, được thêm vào với

npm init -y
42, sẽ là miền Auth0 của bạn. Để biết thêm thông tin, vui lòng xem tài liệu Tìm hiểu cơ bản

Với điều đó, bạn có thể bảo mật các điểm cuối

npm init -y
14,
npm init -y
15 và
npm init -y
45 bằng cách thêm dòng sau ngay trước định nghĩa của chúng

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
0

Trên đoạn mã trên, bạn đang định cấu hình ứng dụng Express thành

npm init -y
46 phần mềm trung gian
npm init -y
35. Lưu ý rằng, vì bạn đang xác định nó sau điểm cuối
npm init -y
48, phần mềm trung gian
npm init -y
35 sẽ không chặn các yêu cầu đến điểm cuối này. Theo cách tương tự, khi bạn xác định nó trước các điểm cuối ________ 614, ________ 645 và ________ 615, phần mềm trung gian ________ 635 sẽ chặn các yêu cầu đối với chúng

Sau khi thực hiện thay đổi này, hãy khởi động lại API của bạn (bằng cách nhấn vào

mkdir express-ads-api
16 +
mkdir express-ads-api
17, sau đó phát hành
{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
75 để bắt đầu lại) và đưa ra yêu cầu sau để xác nhận rằng điểm cuối
npm init -y
48 vẫn công khai

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
1

Nếu mọi thứ hoạt động như mong đợi, bạn vẫn có thể tìm nạp quảng cáo từ điểm cuối này. Tuy nhiên, nếu bạn cố gắng gửi yêu cầu tới bất kỳ điểm cuối nào khác, bạn sẽ gặp lỗi cho biết "Không tìm thấy mã thông báo ủy quyền nào"

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
2

Để có thể sử dụng lại các điểm cuối này, bạn sẽ cần có mã thông báo truy cập. Quá trình nhận mã thông báo sẽ phụ thuộc vào loại khách hàng bạn đang giao dịch. Điều này nằm ngoài phạm vi ở đây, nhưng nếu bạn đang xử lý một ứng dụng SPA (như những ứng dụng được tạo bằng React, Angular và Vue. js), bạn có thể sử dụng thư viện NPM

npm init -y
58. Nếu bạn đang giao dịch với một số loại khách hàng khác (e. g. , ứng dụng web thông thường hoặc ứng dụng gốc), hãy xem tài liệu của Auth0 để biết thêm thông tin

Tuy nhiên, để xem toàn bộ hoạt động, bạn có thể quay lại Trang tổng quan Auth0 của mình, mở API bạn đã tạo trước đó và chuyển đến phần Kiểm tra. Trong phần này, bạn sẽ thấy một nút có tên Sao chép mã thông báo sẽ cung cấp cho bạn mã thông báo tạm thời mà bạn có thể sử dụng để kiểm tra API của mình

NodeJS xây dựng API REST

Vì vậy, hãy nhấp vào nút này và sau đó sử dụng ứng dụng khách HTTP của bạn để đưa ra yêu cầu tới API của bạn bằng mã thông báo thử nghiệm

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
3

Nếu mọi thứ hoạt động như mong đợi, bạn sẽ có thể sử dụng lại các điểm cuối API của mình. Tuyệt nhỉ?

"Phát triển API RESTful với Express và Node. js thật dễ dàng và thú vị. "

Tweet cái này đi

Sự kết luận

Trong bài viết này, bạn đã tìm hiểu về việc phát triển API RESTful dễ dàng như thế nào với Express và Node. js. Cụ thể hơn, bạn đã bắt đầu bằng cách sử dụng

{
  "name": "express-ads-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
8 để tạo ra một ứng dụng hoàn toàn mới. Sau đó, bạn đã sử dụng Express để hiển thị các điểm cuối API nhằm thao túng quảng cáo. Sau đó, cuối cùng, bạn đã học cách bảo mật API của mình bằng Auth0

Với thiết lập này, bạn đã sẵn sàng tiếp tục và bắt đầu xây dựng các API sẵn sàng sản xuất của mình được hỗ trợ bởi Node. js, Express, Mongo và Auth0. Tuy nhiên, trước khi làm như vậy, một điều quan trọng mà bạn có thể muốn tìm hiểu là

npm init -y
60, một phần mềm trung gian Express giúp bạn xác thực dữ liệu do người dùng gửi. Đối với điều đó, hãy kiểm tra bài viết này chúng tôi đã xuất bản gần đây

NodeJS có TỐT CHO API REST không?

Nút. js có cộng đồng lớn và tích cực đóng góp nhiều mô-đun hữu ích và trưởng thành, có thể dễ dàng đưa vào và sử dụng. Ví dụ: để xây dựng API REST, các mô-đun đã biết như express, restify và hapi hoàn toàn phù hợp .

API REST trong NodeJS là gì?

API REST là giao diện lập trình ứng dụng tuân thủ các ràng buộc của kiểu kiến ​​trúc REST và cho phép tương tác với các dịch vụ web RESTful . Các mạng được kết nối với nhau tạo nên trang web. Dịch vụ web là một tập hợp các giao thức và tiêu chuẩn mở được sử dụng để trao đổi dữ liệu giữa các ứng dụng máy khách-máy chủ.

Khung NodeJS nào tốt hơn để xây dựng API RESTful?

Quay lại. js cung cấp khả năng kết nối tốt hơn với bất kỳ Nút nào. js và bạn có thể tích hợp nó với một số dịch vụ API khác nhau. Nền tảng hoạt động tốt nhất trong việc tạo API REST với thời gian phát triển tối thiểu.

NodeJS có còn nhu cầu không?

Công cụ JavaScript phổ biến này đã tồn tại hàng thập kỷ, nhưng nhu cầu về những người có thể thành thạo công cụ này vẫn đang tăng mạnh .