Mô-đun http nodejs

Mục đích của hướng dẫn này là truyền đạt sự hiểu biết vững chắc về quy trình của Node. xử lý HTTP js. Chúng tôi sẽ cho rằng bạn biết, theo nghĩa chung, cách thức hoạt động của các yêu cầu HTTP, bất kể ngôn ngữ hoặc môi trường lập trình. Chúng tôi cũng sẽ giả sử một chút quen thuộc với Node. js

const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
7 và
const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
8. Nếu bạn không hoàn toàn quen thuộc với chúng, bạn nên đọc nhanh tài liệu API cho từng tài liệu đó

Tạo máy chủ

Bất kỳ ứng dụng máy chủ web nút nào cũng sẽ phải tạo một đối tượng máy chủ web. Điều này được thực hiện bằng cách sử dụng

const http = require('http');

const server = http.createServer((request, response) => {
  // magic happens here!
});

Hàm được chuyển vào được gọi một lần cho mọi yêu cầu HTTP được thực hiện đối với máy chủ đó, vì vậy, nó được gọi là trình xử lý yêu cầu. Trên thực tế, đối tượng được trả về là một và những gì chúng ta có ở đây chỉ là cách viết tắt để tạo một đối tượng

const { method, url } = request;
4 và sau đó thêm người nghe sau

const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});

Khi một yêu cầu HTTP đến máy chủ, nút gọi chức năng xử lý yêu cầu với một vài đối tượng tiện dụng để xử lý giao dịch,

const { method, url } = request;
5 và
const { method, url } = request;
6. Chúng ta sẽ đến với những người trong thời gian ngắn

Để thực sự phục vụ các yêu cầu, phương thức cần được gọi trên đối tượng

const { method, url } = request;
4. Trong hầu hết các trường hợp, tất cả những gì bạn cần chuyển đến
const { method, url } = request;
7 là số cổng mà bạn muốn máy chủ lắng nghe. Ngoài ra còn có một số tùy chọn khác, vì vậy hãy tham khảo tài liệu tham khảo API

Phương thức, URL và Tiêu đề

Khi xử lý một yêu cầu, điều đầu tiên bạn có thể muốn làm là xem xét phương thức và URL để có thể thực hiện các hành động thích hợp. Nút. js làm cho điều này tương đối dễ dàng bằng cách đặt các thuộc tính tiện dụng vào đối tượng

const { method, url } = request;
5

const { method, url } = request;

Đối tượng

const { method, url } = request;
5 là một thể hiện của

const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
23 ở đây sẽ luôn là một phương thức/động từ HTTP bình thường.
const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
24 là URL đầy đủ không có máy chủ, giao thức hoặc cổng. Đối với một URL điển hình, điều này có nghĩa là mọi thứ sau và bao gồm dấu gạch chéo thứ ba về phía trước

Tiêu đề cũng không xa. Họ đang ở trong đối tượng của riêng họ trên

const { method, url } = request;
5 được gọi là
const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
26

const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
2

Điều quan trọng cần lưu ý ở đây là tất cả các tiêu đề chỉ được thể hiện bằng chữ thường, bất kể khách hàng thực sự đã gửi chúng như thế nào. Điều này đơn giản hóa nhiệm vụ phân tích tiêu đề cho bất kỳ mục đích nào

Nếu một số tiêu đề được lặp lại, thì các giá trị của chúng sẽ bị ghi đè hoặc nối với nhau dưới dạng các chuỗi được phân tách bằng dấu phẩy, tùy thuộc vào tiêu đề. Trong một số trường hợp, điều này có thể có vấn đề, vì vậy cũng có sẵn

Nội dung yêu cầu

Khi nhận được yêu cầu

const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
28 hoặc
const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
29, cơ quan yêu cầu có thể quan trọng đối với ứng dụng của bạn. Lấy dữ liệu cơ thể liên quan nhiều hơn một chút so với truy cập các tiêu đề yêu cầu. Đối tượng
const { method, url } = request;
5 được chuyển đến trình xử lý sẽ triển khai giao diện. Luồng này có thể được nghe hoặc chuyển đến nơi khác giống như bất kỳ luồng nào khác. Chúng tôi có thể lấy dữ liệu ngay từ luồng bằng cách lắng nghe các sự kiện ________ 202 và ________ 203 của luồng

Đoạn phát ra trong mỗi sự kiện

const http = require('http');

const server = http.createServer((request, response) => {
  // magic happens here!
});
02 là một
const http = require('http');

const server = http.createServer((request, response) => {
  // magic happens here!
});
05. Nếu bạn biết đó sẽ là dữ liệu chuỗi, điều tốt nhất nên làm là thu thập dữ liệu trong một mảng, sau đó tại
const http = require('http');

const server = http.createServer((request, response) => {
  // magic happens here!
});
03, nối và xâu chuỗi nó

const http = require('http');

const server = http.createServer((request, response) => {
  // magic happens here!
});
0

Điều này có vẻ tẻ nhạt, và trong nhiều trường hợp, nó là. May mắn thay, có các mô-đun như

const http = require('http');

const server = http.createServer((request, response) => {
  // magic happens here!
});
07 và
const http = require('http');

const server = http.createServer((request, response) => {
  // magic happens here!
});
08 trên
const http = require('http');

const server = http.createServer((request, response) => {
  // magic happens here!
});
09 có thể giúp che đi một số logic này. Điều quan trọng là phải hiểu rõ về những gì đang diễn ra trước khi đi vào con đường đó, và đó là lý do tại sao bạn ở đây

Đôi nét về lỗi

Vì đối tượng

const { method, url } = request;
5 là một , nên nó cũng là một và hoạt động như một khi xảy ra lỗi

Lỗi trong luồng

const { method, url } = request;
5 tự xuất hiện bằng cách phát ra sự kiện
const { method, url } = request;
14 trên luồng. Nếu bạn không có bộ lắng nghe cho sự kiện đó, lỗi sẽ được đưa ra, điều này có thể làm hỏng Nút của bạn. chương trình js. Do đó, bạn nên thêm trình nghe
const { method, url } = request;
14 vào luồng yêu cầu của mình, ngay cả khi bạn chỉ đăng nhập và tiếp tục theo cách của mình. (Mặc dù có lẽ tốt nhất là gửi một số loại phản hồi lỗi HTTP. Thêm về điều đó sau. )

const { method, url } = request;
1

Có nhiều cách khác để xử lý các lỗi này, chẳng hạn như các công cụ và công cụ trừu tượng khác, nhưng hãy luôn lưu ý rằng các lỗi có thể xảy ra và bạn sẽ phải xử lý chúng.

Những gì chúng ta đã có cho đến nay

Tại thời điểm này, chúng ta đã hoàn thành việc tạo một máy chủ và lấy phương thức, URL, tiêu đề và nội dung từ các yêu cầu. Khi chúng ta kết hợp tất cả lại với nhau, nó có thể trông giống như thế này

const { method, url } = request;
4

Nếu chúng tôi chạy ví dụ này, chúng tôi sẽ có thể nhận được yêu cầu, nhưng không trả lời chúng. Trên thực tế, nếu bạn nhấn ví dụ này trong trình duyệt web, yêu cầu của bạn sẽ hết thời gian vì không có gì được gửi lại cho khách hàng

Cho đến nay, chúng ta vẫn chưa chạm vào đối tượng

const { method, url } = request;
6, đây là một thể hiện của , là một. Nó chứa nhiều phương thức hữu ích để gửi dữ liệu trở lại máy khách. Chúng tôi sẽ đề cập đến điều đó tiếp theo

Mã trạng thái HTTP

Nếu bạn không cần thiết lập nó, mã trạng thái HTTP trên phản hồi sẽ luôn là 200. Tất nhiên, không phải mọi phản hồi HTTP đều đảm bảo điều này và đến một lúc nào đó, bạn chắc chắn sẽ muốn gửi một mã trạng thái khác. Để làm điều đó, bạn có thể đặt thuộc tính

const { method, url } = request;
19

const { method, url } = request;
7

Có một số lối tắt khác cho điều này, như chúng ta sẽ sớm thấy

Đặt tiêu đề phản hồi

Tiêu đề được thiết lập thông qua một phương pháp thuận tiện được gọi là

const { method, url } = request;
8

Khi đặt tiêu đề trên phản hồi, trường hợp không nhạy cảm với tên của chúng. Nếu bạn đặt tiêu đề nhiều lần, giá trị cuối cùng bạn đặt là giá trị được gửi

Rõ ràng gửi dữ liệu tiêu đề

Các phương pháp đặt tiêu đề và mã trạng thái mà chúng ta đã thảo luận giả định rằng bạn đang sử dụng "tiêu đề ẩn". Điều này có nghĩa là bạn đang trông cậy vào nút gửi tiêu đề cho bạn vào đúng thời điểm trước khi bạn bắt đầu gửi dữ liệu nội dung

Nếu muốn, bạn có thể ghi tiêu đề vào luồng phản hồi một cách rõ ràng. Để làm điều này, có một phương thức được gọi là ghi mã trạng thái và tiêu đề vào luồng

const { method, url } = request;
9

Khi bạn đã đặt tiêu đề (ngầm hoặc rõ ràng), bạn đã sẵn sàng để bắt đầu gửi dữ liệu phản hồi

Gửi nội dung phản hồi

Vì đối tượng

const { method, url } = request;
6 là một , nên việc viết nội dung phản hồi cho máy khách chỉ là vấn đề sử dụng các phương thức truyền phát thông thường

const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
0

Hàm

const { method, url } = request;
44 trên luồng cũng có thể nhận một số dữ liệu tùy chọn để gửi dưới dạng bit dữ liệu cuối cùng trên luồng, vì vậy chúng ta có thể đơn giản hóa ví dụ trên như sau

const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
1

Điều quan trọng là đặt trạng thái và tiêu đề trước khi bạn bắt đầu ghi các khối dữ liệu vào nội dung. Điều này có ý nghĩa, vì các tiêu đề xuất hiện trước phần thân trong các phản hồi HTTP

Một điều nhanh chóng khác về lỗi

Luồng

const { method, url } = request;
6 cũng có thể phát ra các sự kiện
const { method, url } = request;
14 và đến một lúc nào đó bạn cũng sẽ phải xử lý điều đó. Tất cả lời khuyên về lỗi phát trực tuyến
const { method, url } = request;
5 vẫn được áp dụng tại đây

Đặt nó tất cả cùng nhau

Bây giờ chúng ta đã học về cách tạo phản hồi HTTP, hãy kết hợp tất cả lại với nhau. Dựa trên ví dụ trước đó, chúng tôi sẽ tạo một máy chủ gửi lại tất cả dữ liệu mà người dùng đã gửi cho chúng tôi. Chúng tôi sẽ định dạng dữ liệu đó dưới dạng JSON bằng cách sử dụng

const { method, url } = request;
48

const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
2

Ví dụ máy chủ Echo

Hãy đơn giản hóa ví dụ trước để tạo một máy chủ echo đơn giản, chỉ gửi bất kỳ dữ liệu nào nhận được trong yêu cầu ngay trong phản hồi. Tất cả những gì chúng ta cần làm là lấy dữ liệu từ luồng yêu cầu và ghi dữ liệu đó vào luồng phản hồi, tương tự như những gì chúng ta đã làm trước đây

const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
3

Bây giờ hãy tinh chỉnh cái này. Chúng tôi chỉ muốn gửi một tiếng vang trong các điều kiện sau

  • Phương thức yêu cầu là POST
  • URL là
    const { method, url } = request;
    
    49

Trong bất kỳ trường hợp nào khác, chúng tôi chỉ muốn trả lời bằng 404

const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
4

Bằng cách kiểm tra URL theo cách này, chúng tôi đang thực hiện một hình thức "định tuyến". Các hình thức định tuyến khác có thể đơn giản như câu lệnh

const { method, url } = request;
70 hoặc phức tạp như toàn bộ khung như
const { method, url } = request;
71. Nếu bạn đang tìm kiếm thứ gì đó định tuyến và không có gì khác, hãy thử
const { method, url } = request;
72

Tuyệt quá. Bây giờ chúng ta hãy cố gắng đơn giản hóa điều này. Hãy nhớ rằng, đối tượng

const { method, url } = request;
5 là a và đối tượng
const { method, url } = request;
6 là a. Điều đó có nghĩa là chúng ta có thể sử dụng để hướng dữ liệu từ cái này sang cái khác. Đó chính xác là những gì chúng tôi muốn cho một máy chủ tiếng vang

const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
5

suối Yay

Mặc dù vậy, chúng tôi vẫn chưa hoàn thành. Như đã đề cập nhiều lần trong hướng dẫn này, lỗi có thể xảy ra và chúng ta cần xử lý chúng

Để xử lý lỗi trên luồng yêu cầu, chúng tôi sẽ ghi lỗi vào

const { method, url } = request;
78 và gửi mã trạng thái 400 để biểu thị một
const { method, url } = request;
79. Tuy nhiên, trong một ứng dụng trong thế giới thực, chúng tôi muốn kiểm tra lỗi để tìm ra mã trạng thái và thông báo chính xác sẽ là gì. Như thường lệ với các lỗi, bạn nên tham khảo tài liệu của
const { method, url } = request;
80

Về phản hồi, chúng tôi sẽ chỉ ghi lỗi vào

const { method, url } = request;
78

const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
6

Bây giờ chúng tôi đã đề cập đến hầu hết các khái niệm cơ bản về xử lý các yêu cầu HTTP. Tại thời điểm này, bạn sẽ có thể

  • Khởi tạo một máy chủ HTTP với chức năng xử lý yêu cầu và yêu cầu nó lắng nghe trên một cổng
  • Nhận tiêu đề, URL, phương thức và dữ liệu nội dung từ các đối tượng
    const { method, url } = request;
    
    5
  • Đưa ra quyết định định tuyến dựa trên URL và/hoặc dữ liệu khác trong đối tượng
    const { method, url } = request;
    
    5
  • Gửi tiêu đề, mã trạng thái HTTP và dữ liệu nội dung qua đối tượng
    const { method, url } = request;
    
    6
  • Dữ liệu đường ống từ đối tượng
    const { method, url } = request;
    
    5 và đối tượng
    const { method, url } = request;
    
    6
  • Xử lý lỗi luồng trong cả luồng
    const { method, url } = request;
    
    5 và
    const { method, url } = request;
    
    6

Từ những điều cơ bản này, Node. máy chủ HTTP js cho nhiều trường hợp sử dụng điển hình có thể được xây dựng. Có rất nhiều thứ khác mà các API này cung cấp, vì vậy hãy nhớ đọc qua các tài liệu API cho

const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
7,
const server = http.createServer();
server.on('request', (request, response) => {
  // the same kind of magic happens here!
});
8 và
const { method, url } = request;
91