Bạn có thể sử dụng Express với PHP không?

Trong bài viết Express đầu tiên này, chúng tôi trả lời các câu hỏi "Nút là gì?" . Chúng tôi sẽ phác thảo các tính năng chính và cho bạn thấy một số khối xây dựng chính của ứng dụng Express [mặc dù tại thời điểm này, bạn chưa có môi trường phát triển để thử nghiệm ứng dụng đó]

điều kiện tiên quyết. Trình độ máy tính cơ bản. Hiểu biết chung về lập trình trang web phía máy chủ và đặc biệt là cơ chế tương tác giữa máy khách và máy chủ trong các trang web. Khách quan. Để làm quen với Express là gì và nó phù hợp với Node như thế nào, nó cung cấp chức năng gì và các khối xây dựng chính của ứng dụng Express

Node [hay chính thức hơn là Node. js] là một môi trường thời gian chạy đa nền tảng, nguồn mở cho phép các nhà phát triển tạo tất cả các loại công cụ và ứng dụng phía máy chủ trong JavaScript. Thời gian chạy được thiết kế để sử dụng bên ngoài ngữ cảnh trình duyệt [tôi. e. chạy trực tiếp trên máy tính hoặc hệ điều hành máy chủ]. Do đó, môi trường bỏ qua các API JavaScript dành riêng cho trình duyệt và thêm hỗ trợ cho các API hệ điều hành truyền thống hơn bao gồm HTTP và thư viện hệ thống tệp

Từ góc độ phát triển máy chủ web, Node có một số lợi ích

  • Hiệu suất tuyệt vời. Nút được thiết kế để tối ưu hóa thông lượng và khả năng mở rộng trong các ứng dụng web và là một giải pháp tốt cho nhiều vấn đề phát triển web phổ biến [e. g. ứng dụng web thời gian thực]
  • Mã được viết bằng "JavaScript cũ đơn giản", có nghĩa là sẽ tốn ít thời gian hơn để xử lý "sự thay đổi ngữ cảnh" giữa các ngôn ngữ khi bạn viết cả mã phía máy khách và phía máy chủ
  • JavaScript là ngôn ngữ lập trình tương đối mới và được hưởng lợi từ những cải tiến trong thiết kế ngôn ngữ khi so sánh với các ngôn ngữ máy chủ web truyền thống khác [e. g. Python, PHP, v.v. ] Nhiều ngôn ngữ mới và phổ biến khác biên dịch/chuyển đổi thành JavaScript, do đó bạn cũng có thể sử dụng TypeScript, CoffeeScript, ClojureScript, Scala, LiveScript, v.v.
  • Trình quản lý gói nút [npm] cung cấp quyền truy cập vào hàng trăm nghìn gói có thể tái sử dụng. Nó cũng có độ phân giải phụ thuộc tốt nhất trong lớp và cũng có thể được sử dụng để tự động hóa hầu hết chuỗi công cụ xây dựng
  • Nút. js là di động. Nó có sẵn trên Microsoft Windows, macOS, Linux, Solaris, FreeBSD, OpenBSD, WebOS và NonStop OS. Hơn nữa, nó được hỗ trợ tốt bởi nhiều nhà cung cấp dịch vụ lưu trữ web, thường cung cấp cơ sở hạ tầng và tài liệu cụ thể để lưu trữ các trang web Node
  • Nó có một cộng đồng nhà phát triển và hệ sinh thái bên thứ ba rất tích cực, với rất nhiều người sẵn sàng giúp đỡ

Bạn có thể sử dụng Nút. js để tạo một máy chủ web đơn giản bằng gói Node HTTP

Ví dụ sau tạo một máy chủ web lắng nghe bất kỳ loại yêu cầu HTTP nào trên URL

node hello.js
8 — khi nhận được yêu cầu, tập lệnh sẽ phản hồi bằng chuỗi. "Chào thế giới". Nếu bạn đã cài đặt nút, bạn có thể làm theo các bước sau để thử ví dụ

  1. Mở Terminal [trên Windows mở tiện ích dòng lệnh]
  2. Tạo thư mục mà bạn muốn lưu chương trình, ví dụ,
    node hello.js
    
    9 và sau đó nhập nó bằng cách nhập lệnh sau vào thiết bị đầu cuối của bạn

    cd test-node
    

  3. Sử dụng trình soạn thảo văn bản yêu thích của bạn, tạo một tệp có tên
    const express = require["express"];
    const app = express[];
    const port = 3000;
    
    app.get["/", function [req, res] {
      res.send["Hello World!"];
    }];
    
    app.listen[port, function [] {
      console.log[`Example app listening on port ${port}!`];
    }];
    
    0 và dán đoạn mã sau vào đó

    // Load HTTP module
    const http = require["http"];
    
    const hostname = "127.0.0.1";
    const port = 8000;
    
    // Create HTTP server
    const server = http.createServer[function [req, res] {
      // Set the response HTTP header with HTTP status and Content type
      res.writeHead[200, { "Content-Type": "text/plain" }];
    
      // Send the response body "Hello World"
      res.end["Hello World\n"];
    }];
    
    // Prints a log once the server starts listening
    server.listen[port, hostname, function [] {
      console.log[`Server running at //${hostname}:${port}/`];
    }];
    

  4. Lưu tệp trong thư mục bạn đã tạo ở trên
  5. Quay trở lại thiết bị đầu cuối và gõ lệnh sau

    node hello.js
    

Cuối cùng, điều hướng đến

const express = require["express"];
const app = express[];
const port = 3000;

app.get["/", function [req, res] {
  res.send["Hello World!"];
}];

app.listen[port, function [] {
  console.log[`Example app listening on port ${port}!`];
}];
1 trong trình duyệt web của bạn;

Các tác vụ phát triển web phổ biến khác không được chính Node hỗ trợ trực tiếp. Nếu bạn muốn thêm xử lý cụ thể cho các động từ HTTP khác nhau [e. g.

const express = require["express"];
const app = express[];
const port = 3000;

app.get["/", function [req, res] {
  res.send["Hello World!"];
}];

app.listen[port, function [] {
  console.log[`Example app listening on port ${port}!`];
}];
2,
const express = require["express"];
const app = express[];
const port = 3000;

app.get["/", function [req, res] {
  res.send["Hello World!"];
}];

app.listen[port, function [] {
  console.log[`Example app listening on port ${port}!`];
}];
3,
const express = require["express"];
const app = express[];
const port = 3000;

app.get["/", function [req, res] {
  res.send["Hello World!"];
}];

app.listen[port, function [] {
  console.log[`Example app listening on port ${port}!`];
}];
4, v.v. ], xử lý riêng các yêu cầu tại các đường dẫn URL khác nhau ["tuyến đường"], phục vụ các tệp tĩnh hoặc sử dụng các mẫu để tự động tạo phản hồi, Node sẽ không được sử dụng nhiều. Bạn sẽ cần phải tự viết mã hoặc bạn có thể tránh phát minh lại bánh xe và sử dụng khung web

Express là khung web Node phổ biến nhất và là thư viện cơ bản cho một số khung web Node phổ biến khác. Nó cung cấp các cơ chế để

  • Viết trình xử lý cho các yêu cầu với các động từ HTTP khác nhau tại các đường dẫn URL [tuyến đường] khác nhau
  • Tích hợp với các công cụ kết xuất "xem" để tạo phản hồi bằng cách chèn dữ liệu vào các mẫu
  • Đặt các cài đặt ứng dụng web phổ biến như cổng sẽ sử dụng để kết nối và vị trí của các mẫu được sử dụng để hiển thị phản hồi
  • Thêm "phần mềm trung gian" xử lý yêu cầu bổ sung tại bất kỳ điểm nào trong quy trình xử lý yêu cầu

Mặc dù bản thân Express khá tối giản, nhưng các nhà phát triển đã tạo ra các gói phần mềm trung gian tương thích để giải quyết hầu hết mọi vấn đề phát triển web. Có các thư viện để làm việc với cookie, phiên, thông tin đăng nhập của người dùng, tham số URL, dữ liệu

const express = require["express"];
const app = express[];
const port = 3000;

app.get["/", function [req, res] {
  res.send["Hello World!"];
}];

app.listen[port, function [] {
  console.log[`Example app listening on port ${port}!`];
}];
3, tiêu đề bảo mật, v.v. Bạn có thể tìm thấy danh sách các gói phần mềm trung gian do nhóm Express duy trì tại Express Middleware [cùng với danh sách một số gói phổ biến của bên thứ 3]

Ghi chú. Sự linh hoạt này là con dao hai lưỡi. Có các gói phần mềm trung gian để giải quyết hầu hết mọi vấn đề hoặc yêu cầu, nhưng việc tìm ra các gói phù hợp để sử dụng đôi khi có thể là một thách thức. Cũng không có "cách đúng" để cấu trúc một ứng dụng và nhiều ví dụ bạn có thể tìm thấy trên Internet không tối ưu hoặc chỉ hiển thị một phần nhỏ những gì bạn cần làm để phát triển ứng dụng web

Node ban đầu được phát hành, chỉ dành cho Linux, vào năm 2009. Trình quản lý gói npm được phát hành vào năm 2010 và hỗ trợ Windows gốc đã được thêm vào năm 2012. Đi sâu vào nếu bạn muốn biết thêm

Express ban đầu được phát hành vào tháng 11 năm 2010 và hiện đang có trên phiên bản chính 4 của API. Bạn có thể xem nhật ký thay đổi để biết thông tin về các thay đổi trong bản phát hành hiện tại và GitHub để biết các ghi chú phát hành lịch sử chi tiết hơn

Mức độ phổ biến của một khung web rất quan trọng vì nó là một chỉ số cho biết liệu nó có tiếp tục được duy trì hay không và những tài nguyên nào có thể có sẵn dưới dạng tài liệu, thư viện bổ trợ và hỗ trợ kỹ thuật

Không có bất kỳ thước đo rõ ràng và sẵn có nào về mức độ phổ biến của các khung phía máy chủ [mặc dù bạn có thể ước tính mức độ phổ biến bằng cách sử dụng các cơ chế như đếm số lượng dự án GitHub và câu hỏi StackOverflow cho từng nền tảng]. Một câu hỏi hay hơn là liệu Node và Express có "đủ phổ biến" để tránh các sự cố của các nền tảng không phổ biến hay không. Họ đang tiếp tục phát triển?

Dựa trên số lượng các công ty nổi tiếng sử dụng Express, số người đóng góp cho cơ sở mã và số người cung cấp hỗ trợ cả miễn phí và trả phí, thì vâng, Express là một khuôn khổ phổ biến

Các khung web thường tự coi mình là "có ý kiến" hoặc "không có ý kiến"

Các khuôn khổ có ý kiến ​​là những khuôn khổ có ý kiến ​​về "cách đúng đắn" để xử lý bất kỳ nhiệm vụ cụ thể nào. Chúng thường hỗ trợ sự phát triển nhanh chóng trong một lĩnh vực cụ thể [giải quyết các vấn đề thuộc một loại cụ thể] bởi vì cách đúng đắn để làm bất cứ điều gì thường được hiểu rõ và được ghi chép đầy đủ. Tuy nhiên, họ có thể kém linh hoạt hơn trong việc giải quyết các vấn đề bên ngoài lĩnh vực chính của mình và có xu hướng đưa ra ít lựa chọn hơn cho những thành phần và phương pháp mà họ có thể sử dụng

Ngược lại, các khung không có ý kiến ​​có ít hạn chế hơn nhiều về cách tốt nhất để kết dính các thành phần lại với nhau để đạt được mục tiêu hoặc thậm chí những thành phần nào nên được sử dụng. Chúng giúp các nhà phát triển dễ dàng sử dụng các công cụ phù hợp nhất để hoàn thành một nhiệm vụ cụ thể, mặc dù bạn phải tự tìm các thành phần đó với chi phí

Express không có ý kiến. Bạn có thể chèn hầu hết mọi phần mềm trung gian tương thích mà bạn thích vào chuỗi xử lý yêu cầu, theo hầu hết mọi thứ tự bạn muốn. Bạn có thể cấu trúc ứng dụng trong một tệp hoặc nhiều tệp và sử dụng bất kỳ cấu trúc thư mục nào. Đôi khi bạn có thể cảm thấy rằng bạn có quá nhiều sự lựa chọn

Trong một trang web hướng dữ liệu truyền thống, một ứng dụng web chờ các yêu cầu HTTP từ trình duyệt web [hoặc ứng dụng khách khác]. Khi nhận được yêu cầu, ứng dụng sẽ tìm ra hành động cần thiết dựa trên mẫu URL và thông tin có thể liên quan có trong dữ liệu

const express = require["express"];
const app = express[];
const port = 3000;

app.get["/", function [req, res] {
  res.send["Hello World!"];
}];

app.listen[port, function [] {
  console.log[`Example app listening on port ${port}!`];
}];
3 hoặc dữ liệu
const express = require["express"];
const app = express[];
const port = 3000;

app.get["/", function [req, res] {
  res.send["Hello World!"];
}];

app.listen[port, function [] {
  console.log[`Example app listening on port ${port}!`];
}];
2. Tùy thuộc vào những gì được yêu cầu, nó có thể đọc hoặc ghi thông tin từ cơ sở dữ liệu hoặc thực hiện các tác vụ khác cần thiết để đáp ứng yêu cầu. Sau đó, ứng dụng sẽ trả về phản hồi cho trình duyệt web, thường tự động tạo trang HTML để trình duyệt hiển thị bằng cách chèn dữ liệu đã truy xuất vào trình giữ chỗ trong mẫu HTML

Express cung cấp các phương thức để chỉ định chức năng nào được gọi cho một động từ HTTP cụ thể [

const express = require["express"];
const app = express[];
const port = 3000;

app.get["/", function [req, res] {
  res.send["Hello World!"];
}];

app.listen[port, function [] {
  console.log[`Example app listening on port ${port}!`];
}];
2,
const express = require["express"];
const app = express[];
const port = 3000;

app.get["/", function [req, res] {
  res.send["Hello World!"];
}];

app.listen[port, function [] {
  console.log[`Example app listening on port ${port}!`];
}];
3,
const express = require["express"];
const app = express[];
0, v.v. ] và mẫu URL ["Route"] và các phương thức để chỉ định công cụ mẫu ["view"] nào được sử dụng, vị trí của các tệp mẫu và mẫu nào sẽ sử dụng để hiển thị phản hồi. Bạn có thể sử dụng phần mềm trung gian Express để thêm hỗ trợ cho cookie, phiên và người dùng, nhận thông số
const express = require["express"];
const app = express[];
const port = 3000;

app.get["/", function [req, res] {
  res.send["Hello World!"];
}];

app.listen[port, function [] {
  console.log[`Example app listening on port ${port}!`];
}];
3/
const express = require["express"];
const app = express[];
const port = 3000;

app.get["/", function [req, res] {
  res.send["Hello World!"];
}];

app.listen[port, function [] {
  console.log[`Example app listening on port ${port}!`];
}];
2, v.v. Bạn có thể sử dụng bất kỳ cơ chế cơ sở dữ liệu nào được Node hỗ trợ [Express không xác định bất kỳ hành vi nào liên quan đến cơ sở dữ liệu]

Các phần sau đây giải thích một số điểm chung mà bạn sẽ thấy khi làm việc với mã Express và Node

Trước tiên, hãy xem xét ví dụ Express Hello World tiêu chuẩn [chúng tôi sẽ thảo luận từng phần của điều này bên dưới và trong các phần tiếp theo]

Ghi chú. Nếu bạn đã cài đặt Node và Express [hoặc nếu bạn cài đặt chúng như trong bài viết tiếp theo], bạn có thể lưu mã này vào tệp văn bản có tên app. js và chạy nó trong dấu nhắc lệnh bash bằng cách gọi

const express = require["express"];
const app = express[];
3

const express = require["express"];
const app = express[];
const port = 3000;

app.get["/", function [req, res] {
  res.send["Hello World!"];
}];

app.listen[port, function [] {
  console.log[`Example app listening on port ${port}!`];
}];

Hai dòng đầu tiên

const express = require["express"];
const app = express[];
4 [nhập] mô-đun cấp tốc và tạo một. Đối tượng này, theo truyền thống được đặt tên là
const express = require["express"];
const app = express[];
5, có các phương thức để định tuyến các yêu cầu HTTP, định cấu hình phần mềm trung gian, hiển thị chế độ xem HTML, đăng ký một công cụ mẫu và sửa đổi điều khiển đó để ứng dụng hoạt động như thế nào [e. g. chế độ môi trường, định nghĩa tuyến đường có phân biệt chữ hoa chữ thường hay không, v.v. ]

Phần giữa của mã [ba dòng bắt đầu bằng

const express = require["express"];
const app = express[];
6] hiển thị định nghĩa tuyến đường. Phương thức
const express = require["express"];
const app = express[];
7 chỉ định chức năng gọi lại sẽ được gọi bất cứ khi nào có yêu cầu HTTP
const express = require["express"];
const app = express[];
const port = 3000;

app.get["/", function [req, res] {
  res.send["Hello World!"];
}];

app.listen[port, function [] {
  console.log[`Example app listening on port ${port}!`];
}];
2 với đường dẫn [
const express = require["express"];
const app = express[];
9] liên quan đến trang gốc. Hàm gọi lại nhận một yêu cầu và một đối tượng phản hồi làm đối số và gọi phản hồi để trả về chuỗi "Xin chào thế giới. "

Khối cuối cùng khởi động máy chủ trên một cổng được chỉ định ['3000'] và in nhận xét nhật ký ra bàn điều khiển. Khi máy chủ đang chạy, bạn có thể truy cập

exports.area = function [width] {
  return width * width;
};
exports.perimeter = function [width] {
  return 4 * width;
};
1 trong trình duyệt của mình để xem phản hồi mẫu được trả về

Mô-đun là một thư viện/tệp JavaScript mà bạn có thể nhập vào mã khác bằng cách sử dụng hàm

const express = require["express"];
const app = express[];
4 của Node. Bản thân Express là một mô-đun, cũng như các thư viện cơ sở dữ liệu và phần mềm trung gian mà chúng tôi sử dụng trong các ứng dụng Express của mình

Mã bên dưới cho biết cách chúng tôi nhập mô-đun theo tên, sử dụng khung Express làm ví dụ. Trước tiên, chúng tôi gọi hàm

const express = require["express"];
const app = express[];
4, chỉ định tên của mô-đun dưới dạng chuỗi [
exports.area = function [width] {
  return width * width;
};
exports.perimeter = function [width] {
  return 4 * width;
};
4] và gọi đối tượng được trả về để tạo một. Sau đó chúng ta có thể truy cập các thuộc tính và chức năng của đối tượng ứng dụng

const express = require["express"];
const app = express[];

Bạn cũng có thể tạo các mô-đun của riêng mình để có thể nhập theo cách tương tự

Ghi chú. Bạn sẽ muốn tạo các mô-đun của riêng mình, vì điều này cho phép bạn sắp xếp mã của mình thành các phần có thể quản lý được — một ứng dụng tệp đơn nguyên khối rất khó hiểu và khó bảo trì. Sử dụng mô-đun cũng giúp bạn quản lý không gian tên của mình, bởi vì chỉ những biến bạn xuất rõ ràng mới được nhập khi bạn sử dụng mô-đun

Để cung cấp các đối tượng bên ngoài mô-đun, bạn chỉ cần hiển thị chúng dưới dạng các thuộc tính bổ sung trên đối tượng

exports.area = function [width] {
  return width * width;
};
exports.perimeter = function [width] {
  return 4 * width;
};
5. Ví dụ, hình vuông. js bên dưới là một tệp xuất các phương thức
exports.area = function [width] {
  return width * width;
};
exports.perimeter = function [width] {
  return 4 * width;
};
6 và
exports.area = function [width] {
  return width * width;
};
exports.perimeter = function [width] {
  return 4 * width;
};
7

exports.area = function [width] {
  return width * width;
};
exports.perimeter = function [width] {
  return 4 * width;
};

Chúng tôi có thể nhập mô-đun này bằng cách sử dụng

const express = require["express"];
const app = express[];
4, sau đó gọi [các] phương thức đã xuất như được hiển thị

const square = require["./square"]; // Here we require[] the name of the file without the [optional] .js file extension
console.log[`The area of a square with a width of 4 is ${square.area[4]}`];

Ghi chú. Bạn cũng có thể chỉ định đường dẫn tuyệt đối đến mô-đun [hoặc tên, như chúng tôi đã làm ban đầu]

Nếu bạn muốn xuất một đối tượng hoàn chỉnh trong một lần gán thay vì xây dựng từng thuộc tính cho nó, hãy gán nó cho

exports.area = function [width] {
  return width * width;
};
exports.perimeter = function [width] {
  return 4 * width;
};
9 như minh họa bên dưới [bạn cũng có thể làm điều này để biến gốc của đối tượng xuất thành hàm tạo hoặc hàm khác]

module.exports = {
  area[width] {
    return width * width;
  },

  perimeter[width] {
    return 4 * width;
  },
};

Ghi chú. Bạn có thể coi

exports.area = function [width] {
  return width * width;
};
exports.perimeter = function [width] {
  return 4 * width;
};
5 là a đến
exports.area = function [width] {
  return width * width;
};
exports.perimeter = function [width] {
  return 4 * width;
};
9 trong một mô-đun nhất định. Trên thực tế,
exports.area = function [width] {
  return width * width;
};
exports.perimeter = function [width] {
  return 4 * width;
};
5 chỉ là một biến được khởi tạo thành giá trị của
exports.area = function [width] {
  return width * width;
};
exports.perimeter = function [width] {
  return 4 * width;
};
9 trước khi mô-đun được đánh giá. Giá trị đó là một tham chiếu đến một đối tượng [đối tượng trống trong trường hợp này]. Điều này có nghĩa là
exports.area = function [width] {
  return width * width;
};
exports.perimeter = function [width] {
  return 4 * width;
};
5 giữ một tham chiếu đến cùng một đối tượng được tham chiếu bởi
exports.area = function [width] {
  return width * width;
};
exports.perimeter = function [width] {
  return 4 * width;
};
9. Điều đó cũng có nghĩa là bằng cách gán một giá trị khác cho
exports.area = function [width] {
  return width * width;
};
exports.perimeter = function [width] {
  return 4 * width;
};
5, nó không còn bị ràng buộc với
exports.area = function [width] {
  return width * width;
};
exports.perimeter = function [width] {
  return 4 * width;
};
9

Để biết thêm thông tin về các mô-đun, hãy xem [Node API docs]

Mã JavaScript thường sử dụng API không đồng bộ thay vì đồng bộ cho các hoạt động có thể mất một chút thời gian để hoàn thành. API đồng bộ là API trong đó mỗi thao tác phải hoàn thành trước khi thao tác tiếp theo có thể bắt đầu. Ví dụ: các hàm nhật ký sau đây là đồng bộ và sẽ in văn bản ra bàn điều khiển theo thứ tự [Thứ nhất, Thứ hai]

console.log["First"];
console.log["Second"];

Ngược lại, API không đồng bộ là API trong đó API sẽ bắt đầu một hoạt động và ngay lập tức quay trở lại [trước khi hoạt động hoàn tất]. Khi hoạt động kết thúc, API sẽ sử dụng một số cơ chế để thực hiện các hoạt động bổ sung. Ví dụ: đoạn mã bên dưới sẽ in ra "Second, First" bởi vì mặc dù phương thức

const square = require["./square"]; // Here we require[] the name of the file without the [optional] .js file extension
console.log[`The area of a square with a width of 4 is ${square.area[4]}`];
8 được gọi trước và trả về ngay lập tức, nhưng thao tác này không hoàn thành trong vài giây

setTimeout[function [] {
  console.log["First"];
}, 3000];
console.log["Second"];

Việc sử dụng API không đồng bộ không chặn thậm chí còn quan trọng hơn trên Node so với trong trình duyệt vì Node là môi trường thực thi theo hướng sự kiện đơn luồng. "Một luồng" có nghĩa là tất cả các yêu cầu đến máy chủ được chạy trên cùng một luồng [chứ không phải được sinh ra thành các quy trình riêng biệt]. Mô hình này cực kỳ hiệu quả về tốc độ và tài nguyên máy chủ, nhưng điều đó có nghĩa là nếu bất kỳ chức năng nào của bạn gọi các phương thức đồng bộ mất nhiều thời gian để hoàn thành, chúng sẽ chặn không chỉ yêu cầu hiện tại mà mọi yêu cầu khác đang được xử lý bởi

Có một số cách để API không đồng bộ thông báo cho ứng dụng của bạn rằng nó đã hoàn thành. Cách phổ biến nhất là đăng ký chức năng gọi lại khi bạn gọi API không đồng bộ, chức năng này sẽ được gọi lại khi thao tác hoàn tất. Đây là cách tiếp cận được sử dụng ở trên

Ghi chú. Việc sử dụng các cuộc gọi lại có thể khá "lộn xộn" nếu bạn có một chuỗi các hoạt động không đồng bộ phụ thuộc phải được thực hiện theo thứ tự vì điều này dẫn đến nhiều cấp độ của các cuộc gọi lại lồng nhau. Sự cố này thường được gọi là "địa ngục gọi lại". Vấn đề này có thể được giảm bớt bằng cách thực hành viết mã tốt [xem http. //gọi lại địa ngục. com/], sử dụng mô-đun như async hoặc tái cấu trúc mã thành các tính năng JavaScript gốc như Promise và async/await. Nút cung cấp chức năng thực hiện gọi lại → Hứa hẹn chuyển đổi một cách thuận tiện

Ghi chú. Một quy ước chung cho Node và Express là sử dụng các cuộc gọi lại lỗi đầu tiên. Trong quy ước này, giá trị đầu tiên trong các hàm gọi lại của bạn là một giá trị lỗi, trong khi các đối số tiếp theo chứa dữ liệu thành công. Có một lời giải thích tốt về lý do tại sao phương pháp này hữu ích trong blog này. nút. js Way - Hiểu các cuộc gọi lại lỗi đầu tiên [fredkschott. com]

Trong ví dụ Hello World Express của chúng tôi [xem ở trên], chúng tôi đã xác định chức năng xử lý tuyến đường [gọi lại] cho các yêu cầu HTTP

const express = require["express"];
const app = express[];
const port = 3000;

app.get["/", function [req, res] {
  res.send["Hello World!"];
}];

app.listen[port, function [] {
  console.log[`Example app listening on port ${port}!`];
}];
2 tới thư mục gốc [
const express = require["express"];
const app = express[];
9]

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
0

Hàm gọi lại nhận một yêu cầu và một đối tượng phản hồi làm đối số. Trong trường hợp này, phương thức gọi phản hồi để trả về chuỗi "Xin chào thế giới. " Ví dụ: có một lệnh để kết thúc chu trình yêu cầu/phản hồi, bạn có thể gọi để gửi phản hồi JSON hoặc gửi tệp

Ghi chú. Bạn có thể sử dụng bất kỳ tên đối số nào bạn thích trong các hàm gọi lại; . Thật hợp lý khi đặt tên cho chúng sao cho bạn có thể xác định đối tượng bạn đang làm việc trong phần thân của cuộc gọi lại

Đối tượng ứng dụng Express cũng cung cấp các phương thức để xác định trình xử lý tuyến đường cho tất cả các động từ HTTP khác, hầu hết được sử dụng theo cùng một cách.

module.exports = {
  area[width] {
    return width * width;
  },

  perimeter[width] {
    return 4 * width;
  },
};
5,
module.exports = {
  area[width] {
    return width * width;
  },

  perimeter[width] {
    return 4 * width;
  },
};
6,
module.exports = {
  area[width] {
    return width * width;
  },

  perimeter[width] {
    return 4 * width;
  },
};
7,
module.exports = {
  area[width] {
    return width * width;
  },

  perimeter[width] {
    return 4 * width;
  },
};
8,
module.exports = {
  area[width] {
    return width * width;
  },

  perimeter[width] {
    return 4 * width;
  },
};
9,
console.log["First"];
console.log["Second"];
0,
console.log["First"];
console.log["Second"];
1,
console.log["First"];
console.log["Second"];
2,
console.log["First"];
console.log["Second"];
3,
console.log["First"];
console.log["Second"];
4,
console.log["First"];
console.log["Second"];
5,
console.log["First"];
console.log["Second"];
6,
console.log["First"];
console.log["Second"];
7,
console.log["First"];
console.log["Second"];
8,
console.log["First"];
console.log["Second"];
9,
setTimeout[function [] {
  console.log["First"];
}, 3000];
console.log["Second"];
0,
setTimeout[function [] {
  console.log["First"];
}, 3000];
console.log["Second"];
1,
setTimeout[function [] {
  console.log["First"];
}, 3000];
console.log["Second"];
2,
setTimeout[function [] {
  console.log["First"];
}, 3000];
console.log["Second"];
3,
setTimeout[function [] {
  console.log["First"];
}, 3000];
console.log["Second"];
4,
setTimeout[function [] {
  console.log["First"];
}, 3000];
console.log["Second"];
5,
setTimeout[function [] {
  console.log["First"];
}, 3000];
console.log["Second"];
6,
setTimeout[function [] {
  console.log["First"];
}, 3000];
console.log["Second"];
7

Có một phương thức định tuyến đặc biệt,

setTimeout[function [] {
  console.log["First"];
}, 3000];
console.log["Second"];
8, sẽ được gọi để phản hồi bất kỳ phương thức HTTP nào. Điều này được sử dụng để tải các chức năng phần mềm trung gian tại một đường dẫn cụ thể cho tất cả các phương thức yêu cầu. Ví dụ sau [từ tài liệu Express] cho thấy một trình xử lý sẽ được thực thi đối với các yêu cầu tới
setTimeout[function [] {
  console.log["First"];
}, 3000];
console.log["Second"];
9 bất kể động từ HTTP được sử dụng là gì [miễn là nó được hỗ trợ bởi ]

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
1

Các tuyến cho phép bạn khớp các mẫu ký tự cụ thể trong một URL và trích xuất một số giá trị từ URL và chuyển chúng dưới dạng tham số cho trình xử lý tuyến [dưới dạng thuộc tính của đối tượng yêu cầu được truyền dưới dạng tham số]

Thông thường sẽ rất hữu ích khi nhóm các trình xử lý định tuyến cho một phần cụ thể của trang web lại với nhau và truy cập chúng bằng tiền tố định tuyến chung [e. g. một trang web có Wiki có thể có tất cả các tuyến đường liên quan đến wiki trong một tệp và truy cập chúng bằng tiền tố tuyến đường là /wiki/]. Trong Express, điều này đạt được bằng cách sử dụng đối tượng. Ví dụ: chúng ta có thể tạo lộ trình wiki của mình trong một mô-đun có tên wiki. js, sau đó xuất đối tượng

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
01, như hình bên dưới

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
2

Ghi chú. Việc thêm các tuyến đường vào đối tượng

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
01 cũng giống như thêm các tuyến đường vào đối tượng
const express = require["express"];
const app = express[];
5 [như đã trình bày trước đó]

Để sử dụng bộ định tuyến trong tệp ứng dụng chính của chúng tôi, sau đó chúng tôi sẽ

const express = require["express"];
const app = express[];
4 mô-đun tuyến đường [wiki. js], sau đó gọi
// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
05 trên ứng dụng Express để thêm Bộ định tuyến vào đường dẫn xử lý phần mềm trung gian. Hai tuyến đường sau đó sẽ có thể truy cập được từ
// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
06 và
// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
07

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
3

Chúng tôi sẽ chỉ cho bạn nhiều hơn về cách làm việc với các tuyến đường và đặc biệt là về cách sử dụng

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
01, sau này trong phần được liên kết Các tuyến đường và bộ điều khiển

Phần mềm trung gian được sử dụng rộng rãi trong các ứng dụng Express, cho các tác vụ từ cung cấp tệp tĩnh đến xử lý lỗi đến nén phản hồi HTTP. Trong khi các hàm định tuyến kết thúc chu kỳ phản hồi yêu cầu HTTP bằng cách trả lại một số phản hồi cho máy khách HTTP, thì các hàm phần mềm trung gian thường thực hiện một số thao tác đối với yêu cầu hoặc phản hồi, sau đó gọi hàm tiếp theo trong "ngăn xếp", có thể là phần mềm trung gian hơn hoặc một tuyến đường . Thứ tự gọi phần mềm trung gian tùy thuộc vào nhà phát triển ứng dụng

Ghi chú. Phần mềm trung gian có thể thực hiện bất kỳ hoạt động nào, thực thi bất kỳ mã nào, thay đổi đối tượng yêu cầu và phản hồi và nó cũng có thể kết thúc chu kỳ phản hồi yêu cầu. Nếu nó không kết thúc chu kỳ thì nó phải gọi

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
09 để chuyển quyền điều khiển cho chức năng phần mềm trung gian tiếp theo [hoặc yêu cầu sẽ bị treo]

Hầu hết các ứng dụng sẽ sử dụng phần mềm trung gian của bên thứ ba để đơn giản hóa các tác vụ phát triển web phổ biến như làm việc với cookie, phiên, xác thực người dùng, yêu cầu truy cập

const express = require["express"];
const app = express[];
const port = 3000;

app.get["/", function [req, res] {
  res.send["Hello World!"];
}];

app.listen[port, function [] {
  console.log[`Example app listening on port ${port}!`];
}];
3 và dữ liệu JSON, ghi nhật ký, v.v. Bạn có thể tìm thấy danh sách các gói phần mềm trung gian do nhóm Express duy trì [bao gồm cả các gói bên thứ 3 phổ biến khác]. Các gói Express khác có sẵn trên trình quản lý gói npm

Để sử dụng phần mềm trung gian của bên thứ ba, trước tiên bạn cần cài đặt nó vào ứng dụng của mình bằng npm. Ví dụ: để cài đặt phần mềm trung gian ghi nhật ký yêu cầu HTTP morgan, bạn sẽ làm điều này

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
4

Sau đó, bạn có thể gọi

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
05 trên đối tượng ứng dụng Express để thêm phần mềm trung gian vào ngăn xếp

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
5

Ghi chú. Các chức năng định tuyến và phần mềm trung gian được gọi theo thứ tự mà chúng được khai báo. Đối với một số phần mềm trung gian, thứ tự là quan trọng [ví dụ: nếu phần mềm trung gian phiên phụ thuộc vào phần mềm trung gian cookie, thì trình xử lý cookie phải được thêm vào trước]. Hầu như luôn luôn xảy ra trường hợp phần mềm trung gian được gọi trước khi thiết lập tuyến đường hoặc trình xử lý tuyến đường của bạn sẽ không có quyền truy cập vào chức năng do phần mềm trung gian của bạn thêm vào

Bạn có thể viết các chức năng phần mềm trung gian của riêng mình và bạn có thể phải làm như vậy [nếu chỉ để tạo mã xử lý lỗi]. Sự khác biệt duy nhất giữa chức năng phần mềm trung gian và hàm gọi lại trình xử lý tuyến là các hàm phần mềm trung gian có đối số thứ ba

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
12, mà các hàm phần mềm trung gian dự kiến ​​sẽ gọi nếu chúng không hoàn thành chu trình yêu cầu [khi chức năng phần mềm trung gian được gọi, phần này chứa

Bạn có thể thêm chức năng phần mềm trung gian vào chuỗi xử lý cho tất cả các phản hồi với

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
13 hoặc cho một động từ HTTP cụ thể bằng phương pháp được liên kết.
const express = require["express"];
const app = express[];
7,
// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
15, v.v. Các tuyến đường được chỉ định theo cùng một cách cho cả hai trường hợp, mặc dù tuyến đường là tùy chọn khi gọi
// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
13

Ví dụ dưới đây cho thấy cách bạn có thể thêm chức năng phần mềm trung gian bằng cách sử dụng cả hai cách tiếp cận và có/không có tuyến đường

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
6

Ghi chú. Ở trên chúng ta khai báo riêng hàm middleware rồi set nó làm callback. Trong chức năng xử lý tuyến đường trước đây của chúng tôi, chúng tôi đã khai báo chức năng gọi lại khi nó được sử dụng. Trong JavaScript, một trong hai cách tiếp cận đều hợp lệ

Tài liệu Express có nhiều tài liệu tuyệt vời hơn về cách sử dụng và viết phần mềm trung gian Express

Bạn có thể sử dụng phần mềm trung gian để phục vụ các tệp tĩnh, bao gồm hình ảnh, CSS và JavaScript của bạn [

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
17 là chức năng phần mềm trung gian duy nhất thực sự là một phần của Express]. Ví dụ: bạn sẽ sử dụng dòng bên dưới để phân phát hình ảnh, tệp CSS và tệp JavaScript từ thư mục có tên 'công khai' ở cùng cấp độ với nơi bạn gọi nút

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
7

Bất kỳ tệp nào trong thư mục chung đều được phục vụ bằng cách thêm tên tệp của chúng [liên quan đến thư mục "công khai"] cơ sở vào URL cơ sở. Ví dụ

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
8

Bạn có thể gọi

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
17 nhiều lần để phục vụ nhiều thư mục. Nếu một chức năng của phần mềm trung gian không thể tìm thấy tệp thì tệp đó sẽ được chuyển sang phần mềm trung gian tiếp theo [thứ tự phần mềm trung gian được gọi dựa trên thứ tự khai báo của bạn]

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
9

Bạn cũng có thể tạo tiền tố ảo cho các URL tĩnh của mình thay vì thêm các tệp vào URL cơ sở. Ví dụ: ở đây chúng tôi để các tệp được tải với tiền tố "/media"

node hello.js
0

Bây giờ, bạn có thể tải các tệp trong thư mục

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
19 từ tiền tố đường dẫn
// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
20

node hello.js
1

Ghi chú. Xem thêm Cung cấp tệp tĩnh trong Express

Lỗi được xử lý bởi một hoặc nhiều hàm phần mềm trung gian đặc biệt có bốn đối số, thay vì ba đối số thông thường.

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
21. Ví dụ

node hello.js
2

Chúng có thể trả về bất kỳ nội dung nào được yêu cầu, nhưng phải được gọi sau tất cả các cuộc gọi

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
13 khác và định tuyến để chúng là phần mềm trung gian cuối cùng trong quy trình xử lý yêu cầu

Express đi kèm với trình xử lý lỗi tích hợp, xử lý mọi lỗi còn lại có thể gặp phải trong ứng dụng. Chức năng phần mềm trung gian xử lý lỗi mặc định này được thêm vào cuối ngăn xếp chức năng phần mềm trung gian. Nếu bạn chuyển một lỗi tới

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
09 và bạn không xử lý nó trong trình xử lý lỗi, nó sẽ được xử lý bởi trình xử lý lỗi tích hợp;

Ghi chú. Dấu vết ngăn xếp không được bao gồm trong môi trường sản xuất. Để chạy nó ở chế độ sản xuất, bạn cần đặt biến môi trường

// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
24 thành '
// Load HTTP module
const http = require["http"];

const hostname = "127.0.0.1";
const port = 8000;

// Create HTTP server
const server = http.createServer[function [req, res] {
  // Set the response HTTP header with HTTP status and Content type
  res.writeHead[200, { "Content-Type": "text/plain" }];

  // Send the response body "Hello World"
  res.end["Hello World\n"];
}];

// Prints a log once the server starts listening
server.listen[port, hostname, function [] {
  console.log[`Server running at //${hostname}:${port}/`];
}];
25

Ghi chú. HTTP404 và các mã trạng thái "lỗi" khác không được coi là lỗi. Nếu bạn muốn xử lý những thứ này, bạn có thể thêm chức năng của phần mềm trung gian để thực hiện việc này. Để biết thêm thông tin xem

Để biết thêm thông tin, hãy xem Xử lý lỗi [Tài liệu nhanh]

Các ứng dụng Express có thể sử dụng bất kỳ cơ chế cơ sở dữ liệu nào được Node hỗ trợ [Bản thân Express không xác định bất kỳ hành vi/yêu cầu bổ sung cụ thể nào để quản lý cơ sở dữ liệu]. Có nhiều tùy chọn, bao gồm PostgreSQL, MySQL, Redis, SQLite, MongoDB, v.v.

Để sử dụng những thứ này, trước tiên bạn phải cài đặt trình điều khiển cơ sở dữ liệu bằng npm. Ví dụ: để cài đặt trình điều khiển cho NoQuery MongoDB phổ biến, bạn sẽ sử dụng lệnh

node hello.js
3

Bản thân cơ sở dữ liệu có thể được cài đặt cục bộ hoặc trên máy chủ đám mây. Trong mã Express, bạn yêu cầu trình điều khiển, kết nối với cơ sở dữ liệu, sau đó thực hiện các thao tác tạo, đọc, cập nhật và xóa [CRUD]. Ví dụ bên dưới [từ tài liệu Express] cho thấy cách bạn có thể tìm thấy các bản ghi "động vật có vú" bằng MongoDB

Điều này hoạt động với các phiên bản cũ hơn của phiên bản mongodb ~ 2. 2. 33

node hello.js
4

Đối với phiên bản mongodb 3. 0 trở lên

node hello.js
5

Một cách tiếp cận phổ biến khác là truy cập cơ sở dữ liệu của bạn một cách gián tiếp, thông qua Trình ánh xạ quan hệ đối tượng ["ORM"]. Theo cách tiếp cận này, bạn xác định dữ liệu của mình là "đối tượng" hoặc "mô hình" và ORM ánh xạ những dữ liệu này sang định dạng cơ sở dữ liệu cơ bản. Cách tiếp cận này có lợi ích là với tư cách là nhà phát triển, bạn có thể tiếp tục suy nghĩ về các đối tượng JavaScript thay vì ngữ nghĩa cơ sở dữ liệu và có một nơi rõ ràng để thực hiện xác thực và kiểm tra dữ liệu đến. Chúng ta sẽ nói nhiều hơn về cơ sở dữ liệu trong một bài viết sau

Để biết thêm thông tin, hãy xem Tích hợp cơ sở dữ liệu [Tài liệu nhanh]

Công cụ mẫu [còn được gọi là "công cụ xem" theo tài liệu của Express] cho phép bạn chỉ định cấu trúc của tài liệu đầu ra trong một mẫu, sử dụng trình giữ chỗ cho dữ liệu sẽ được điền vào khi trang được tạo. Mẫu thường được sử dụng để tạo HTML, nhưng cũng có thể tạo các loại tài liệu khác. Express có hỗ trợ cho , và có một so sánh hữu ích về các công cụ phổ biến hơn tại đây. So sánh các công cụ tạo khuôn mẫu JavaScript. Ngọc bích, ria mép, bụi và hơn thế nữa

Trong mã cài đặt ứng dụng của bạn, bạn đặt công cụ mẫu để sử dụng và vị trí nơi Express sẽ tìm kiếm các mẫu bằng cách sử dụng cài đặt 'chế độ xem' và 'công cụ xem', như minh họa bên dưới [bạn cũng sẽ phải cài đặt gói chứa thư viện mẫu của mình. ]

node hello.js
6

The appearance of the template will depend on what engine you use. Assuming that you have a template file named "index." that contains placeholders for data variables named 'title' and "message", you would call in a route handler function to create and send the HTML response:

node hello.js
7

Để biết thêm thông tin, hãy xem Sử dụng công cụ mẫu với Express [Express docs]

Express không đưa ra giả định nào về cấu trúc hoặc thành phần bạn sử dụng. Các tuyến, dạng xem, tệp tĩnh và logic dành riêng cho ứng dụng khác có thể tồn tại trong bất kỳ số lượng tệp nào với bất kỳ cấu trúc thư mục nào. Mặc dù hoàn toàn có thể có toàn bộ ứng dụng Express trong một tệp, nhưng thông thường, bạn nên chia ứng dụng của mình thành các tệp dựa trên chức năng [e. g. quản lý tài khoản, blog, diễn đàn thảo luận] và miền vấn đề kiến ​​trúc [e. g. mô hình, chế độ xem hoặc bộ điều khiển nếu bạn đang sử dụng kiến ​​trúc MVC]

Trong chủ đề sau, chúng ta sẽ sử dụng Trình tạo ứng dụng nhanh, tạo ra bộ khung ứng dụng mô-đun mà chúng ta có thể dễ dàng mở rộng để tạo ứng dụng web

Xin chúc mừng, bạn đã hoàn thành bước đầu tiên trong hành trình Express/Node của mình. Bây giờ bạn đã hiểu các lợi ích chính của Express và Node cũng như đại khái các phần chính của ứng dụng Express có thể trông như thế nào [các tuyến, phần mềm trung gian, xử lý lỗi và mã mẫu]. Bạn cũng nên hiểu rằng với Express là một khuôn khổ không có ý kiến, cách bạn kết hợp các phần này lại với nhau và các thư viện mà bạn sử dụng phần lớn tùy thuộc vào bạn.

Tất nhiên Express cố tình là một khung ứng dụng web rất nhẹ, rất nhiều lợi ích và tiềm năng của nó đến từ các tính năng và thư viện của bên thứ ba. Chúng ta sẽ xem xét những điều đó chi tiết hơn trong các bài viết sau. Trong bài viết tiếp theo của chúng tôi, chúng tôi sẽ xem xét việc thiết lập môi trường phát triển Node, để bạn có thể bắt đầu thấy một số mã Express đang hoạt động

Express js có lỗi thời không?

Express đã không được cập nhật trong nhiều năm và phiên bản tiếp theo của nó đã ở dạng alpha được 6 năm. Mọi người có thể nghĩ rằng nó không được cập nhật vì API ổn định và không cần thay đổi. thực tế là. Express không biết cách xử lý async/await.

Ngôn ngữ nào được sử dụng trong Express?

js/JavaScript ] Express là một khung web phổ biến không có ý kiến, được viết bằng JavaScript và được lưu trữ trong Nút. môi trường thời gian chạy js.

Express js có đa nền tảng không?

js] là một mã nguồn mở, môi trường thời gian chạy đa nền tảng cho phép các nhà phát triển tạo tất cả các loại công cụ và ứng dụng phía máy chủ .

Express có tốt hơn nút không?

Express nhận được nhiều tính năng khác nhau từ Node. js và một trong số đó là máy chủ không chặn có thể xử lý yêu cầu của người dùng tốt hơn . Do đó, các nhà phát triển sẽ dễ dàng tạo các ứng dụng web có thể mở rộng dễ dàng hơn. Khung Express được trang bị khả năng mở rộng và các tính năng tương tự như máy chủ Nginx và Apache.

Chủ Đề