Node.js 'Connect, Express và phần mềm trung gian là gì?


634

Mặc dù biết JavaScript khá rõ, tôi vẫn bối rối chính xác ba dự án trong hệ sinh thái Node.js này làm gì. Có phải cái gì đó giống như Rails 'Rack? Ai đó có thể vui lòng giải thích?


1
Tôi chưa sử dụng kết nối, nhưng trang này chắc chắn làm cho âm thanh tương tự như Rails 'Rack. Bạn có hiểu phần mềm trung gian là gì, bên ngoài bối cảnh của Node không?
Matt Ball

Thành thật mà nói, không nhiều như tôi muốn. Theo như tôi biết thì đó là lớp thực hiện tất cả các công cụ trước ứng dụng như định tuyến, gzipping, tiêu đề, cookie ..? Tôi có đúng không Vì vậy, nó có hoạt động theo cách định tuyến đến bộ điều khiển / hành động MVC thích hợp không nằm trong khung MVC (như Rails), nhưng trong phần mềm trung gian không?
Untilda


8
ĐIỀU NÀY S CLE R CLE RÀNG TẤT CẢ CÁC NHÂN ĐÔI CỦA BẠN VÀ TRẢ LỜI NHIỀU CÂU HỎI THÊM NHIỀU BẠN CÓ Tôi hiểu rằng đã quá muộn (hy vọng ai đó cuộn xuống ...), nhưng đọc bài viết trên blog sau đây sẽ xóa tất cả các câu hỏi mà bạn có về Connect, Express và Middleware . Nó cũng dạy cho bạn một chút về Node.js. http://evanhahn.com/under
Hiểu

@DiegoCaxito Liên kết của bạn bị hỏng.
Cột

Câu trả lời:


891

[ Cập nhật: Kể từ phiên bản 4.0, Express không còn sử dụng Connect. Tuy nhiên, Express vẫn tương thích với phần mềm trung gian được viết cho Connect. Câu trả lời ban đầu của tôi là dưới đây.]

Tôi rất vui vì bạn đã hỏi về điều này, bởi vì đây chắc chắn là một điểm nhầm lẫn phổ biến đối với những người đang xem Node.js. Đây là cách tốt nhất của tôi để giải thích nó:

  • Bản thân Node.js cung cấp một mô-đun http , có createServerphương thức trả về một đối tượng mà bạn có thể sử dụng để đáp ứng các yêu cầu HTTP. Đối tượng đó kế thừa http.Servernguyên mẫu.

  • Connect cũng cung cấp một createServerphương thức, trả về một đối tượng kế thừa phiên bản mở rộng của http.Server. Các tiện ích mở rộng của Connect chủ yếu ở đó để giúp bạn dễ dàng cắm phần mềm trung gian . Đó là lý do Connect mô tả chính nó như là một "khung phần mềm trung gian" và thường được tương tự như Rack của Ruby.

  • Express thực hiện để Kết nối những gì Connect thực hiện với mô-đun http: Nó cung cấp một createServerphương thức mở rộng Servernguyên mẫu của Connect . Vì vậy, tất cả các chức năng của Connect đều có, cộng với hiển thị chế độ xem và DSL tiện dụng để mô tả các tuyến đường. Ruby's Sinatra là một sự tương tự tốt.

  • Sau đó, có các khung khác đi xa hơn và mở rộng Express! Ví dụ, Zappa , tích hợp hỗ trợ cho CoffeeScript, jQuery phía máy chủ và thử nghiệm.

Đây là một ví dụ cụ thể về ý nghĩa của "phần mềm trung gian": Trong số đó, không có phần nào ở trên phục vụ các tệp tĩnh cho bạn. Nhưng chỉ cần ném vào connect.static(một phần mềm trung gian đi kèm với Kết nối), được định cấu hình để trỏ đến một thư mục và máy chủ của bạn sẽ cung cấp quyền truy cập vào các tệp trong thư mục đó. Lưu ý rằng Express cũng cung cấp phần mềm trung gian của Connect; express.staticcũng giống như connect.static. (Cả hai đều được biết staticProviderđến cho đến gần đây.)

Ấn tượng của tôi là hầu hết các ứng dụng Node.js "thực" đang được phát triển với Express ngày nay; các tính năng mà nó bổ sung là cực kỳ hữu ích và tất cả các chức năng cấp thấp hơn vẫn còn đó nếu bạn muốn.


130
Một điều làm tôi khó chịu về Connect là tài liệu của nó dường như không thừa nhận rằng Node không chỉ là máy chủ HTTP. "Connect là khung phần mềm trung gian cho Node.js" - không, "Connect là khung phần mềm trung gian cho máy chủ HTTP của Node.js"
mỏng

46
@slim Tôi nghĩ bạn đang đọc quá nhiều. Các nhà sản xuất Connect là nhà phát triển Node ưu việt; họ cũng nhận thức được rằng Node không chỉ là máy chủ HTTP. Nhưng nó một máy chủ HTTP được tích hợp và Connect là một khung phần mềm trung gian mà bạn có thể sử dụng trong ứng dụng Node.js của mình.
Trevor Burnham

22
Ồ tôi chắc chắn rằng các nhà sản xuất Connect hoàn toàn nhận thức được điều đó. Họ không thể đạt được những gì họ có mà không có sự hiểu biết thấu đáo về Node. Nhưng sự lựa chọn từ ngữ là khó hiểu cho những người mới đến Node; và cho người mới kết nối.
mỏng

10
rõ ràng, những gì tất cả các câu trả lời nên phấn đấu. Trevor làm việc tuyệt vời.
Đánh dấu Essel

6
Giải thích tuyệt vời. Những câu trả lời như thế này giúp đưa những người mới vào hệ sinh thái Node.js. Đối với những người làm quen với việc phát triển ứng dụng web trong Node.js, Express là nơi để bắt đầu. Để tiếp tục tương tự Ruby, Express được so sánh với Sinatra. Điều này đặc biệt tuyệt vời khi tạo API JSON cho các ứng dụng phía máy khách Ajax. Một điều tôi đã tìm thấy là một khi một ứng dụng đạt đến một mức độ phức tạp nhất định, thì một lớp khác là cần thiết hơn là Rails thích. Tôi đang làm việc trên Đầu máy cho mục đích này, lớp tiếp theo trên Express.
Jared Hanson

159

Câu trả lời được chấp nhận là thực sự cũ (và bây giờ sai). Đây là thông tin (có nguồn) dựa trên phiên bản Kết nối hiện tại (3.0) / Express (4.0).

Những gì Node.js đi kèm

http / https createServer chỉ đơn giản là thực hiện một cuộc gọi lại (req, res), vd

var server = http.createServer(function (request, response) {

    // respond
    response.write('hello client!');
    response.end();

});

server.listen(3000);

Những gì kết nối thêm

Middleware về cơ bản là bất kỳ phần mềm nào nằm giữa mã ứng dụng của bạn và một số API cấp thấp. Connect mở rộng chức năng máy chủ HTTP tích hợp và thêm khung plugin. Các plugin hoạt động như phần mềm trung gian và do đó kết nối là một khung phần mềm trung gian

Cách thức thực hiện điều đó khá đơn giản ( và trên thực tế mã rất ngắn! ). Ngay sau khi bạn gọi, var connect = require('connect'); var app = connect();bạn nhận được một chức năng appcó thể:

  1. Có thể xử lý một yêu cầu và trả lại một phản hồi. Điều này là do về cơ bản bạn có được chức năng này
  2. Có chức năng thành viên .use( nguồn ) để quản lý các plugin ( xuất phát từ đâydòng mã đơn giản này ).

Vì 1.) bạn có thể làm như sau:

var app = connect();

// Register with http
http.createServer(app)
    .listen(3000);

Kết hợp với 2.) và bạn nhận được:

var connect = require('connect');

// Create a connect dispatcher
var app = connect()
      // register a middleware
      .use(function (req, res, next) { next(); });

// Register with http
http.createServer(app)
    .listen(3000);

Connect cung cấp một chức năng tiện ích để tự đăng ký httpđể bạn không cần thực hiện cuộc gọi http.createServer(app). Mã được gọi listenvà mã của nó chỉ đơn giản là tạo một máy chủ http mới, trình đăng ký kết nối dưới dạng gọi lại và chuyển tiếp các đối số tới http.listen. Từ nguồn

app.listen = function(){
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

Vì vậy, bạn có thể làm:

var connect = require('connect');

// Create a connect dispatcher and register with http
var app = connect()
          .listen(3000);
console.log('server running on port 3000');

Nó vẫn còn cũ của bạn http.createServervới một khung plugin trên đầu trang.

Những gì ExpressJS thêm vào

ExpressJS và kết nối là các dự án song song. Connect chỉ là một khung công tác trung gian, với một usechức năng tốt . Express không phụ thuộc vào Connect ( xem gói.json ). Tuy nhiên, nó thực hiện mọi thứ kết nối tức là:

  1. Có thể được đăng ký với createServerlike kết nối vì nó cũng chỉ là một chức năng có thể mất một req/ rescặp ( nguồn ).
  2. Một chức năng sử dụng để đăng ký phần mềm trung gian .
  3. Một listenchức năng tiện ích để tự đăng ký với http

Ngoài những gì kết nối cung cấp (thể hiện sự trùng lặp), nó còn có một loạt các tính năng khác. ví dụ

  1. Đã xem hỗ trợ động cơ .
  2. động từ cấp cao nhất (get / post, v.v.) cho bộ định tuyến của nó .
  3. Có hỗ trợ cài đặt ứng dụng .

Phần mềm trung gian được chia sẻ

Các usechức năng của ExpressJS kết nối tương thích và do đó middleware được chia sẻ . Cả hai đều là khung công tác trung gian, express chỉ có nhiều hơn một khung công tác trung gian đơn giản .

Bạn nên sử dụng cái nào?

Ý kiến ​​của tôi: bạn được thông báo đủ ^ dựa trên ^ để đưa ra lựa chọn của riêng bạn.

  • Sử dụng http.createServernếu bạn đang tạo một cái gì đó như kết nối / expressjs từ đầu.
  • Sử dụng kết nối nếu bạn là tác giả của phần mềm trung gian, các giao thức thử nghiệm, v.v. vì nó là một bản tóm tắt hay trên đầu trang http.createServer
  • Sử dụng ExpressJS nếu bạn là tác giả trang web.

Hầu hết mọi người chỉ nên sử dụng ExpressJS.

Có gì sai về câu trả lời được chấp nhận

Điều này có thể đúng như một số thời điểm, nhưng bây giờ sai:

kế thừa phiên bản mở rộng của http.Server

Sai lầm. Nó không mở rộng nó và như bạn đã thấy ... sử dụng nó

Express làm để kết nối những gì Connect làm với mô-đun http

Express 4.0 thậm chí không phụ thuộc vào kết nối. xem phần phụ thuộc pack.json hiện tại


bạn nói cung cấp cho bạn khả năng xử lý yêu cầu và trả lời phản hồi nhưng mọi người nói rằng Express thực sự là máy chủ web ... Tôi bối rối. Sẽ không gửi phản hồi trở lại cần khả năng của máy chủ web (như Express)?
positiveGuy

1
thứ tốt, cảm ơn! rất hữu ích ... đặc biệt là không biết rằng kết nối thực sự là thứ cung cấp định tuyến và thể hiện chỉ thừa hưởng điều đó, nó không phải là nhà cung cấp định tuyến / nguồn duy nhất. Và các trường hợp sử dụng cuối cùng rất hữu ích vì tôi cho rằng tôi phải sử dụng kết nối AND express nhưng thực sự tất cả những gì bạn cần sử dụng là express cho các ứng dụng web nên điều này đã giúp tôi giải quyết rất nhiều. Bạn không cài đặt cả hai, bạn cài đặt cái này hay cái kia!
positiveGuy

Câu trả lời của bạn nên được đặt lên hàng đầu. Khi tôi đọc câu trả lời được chấp nhận, tôi đã nâng cao nó. Nhưng sau khi đọc câu trả lời của bạn ... naahhh
Arun Joshla

67

node.js

Node.js là một công cụ javascript cho phía máy chủ.
Ngoài tất cả các khả năng của js, nó bao gồm các khả năng kết nối mạng (như HTTP) và truy cập vào hệ thống tệp.
Điều này khác với js phía máy khách nơi các tác vụ mạng được độc quyền bởi trình duyệt và việc truy cập vào hệ thống tệp bị cấm vì lý do bảo mật.

node.js như một máy chủ web: express

Một cái gì đó chạy trong máy chủ, hiểu HTTP và có thể truy cập các tệp âm thanh như một máy chủ web. Nhưng nó không phải là một.
Để làm cho node.js hoạt động giống như một máy chủ web, người ta phải lập trình nó: xử lý các yêu cầu HTTP đến và cung cấp các phản hồi thích hợp.
Đây là những gì Express làm: đó là việc triển khai máy chủ web trong js.
Do đó, việc triển khai một trang web cũng giống như cấu hình các tuyến Express và lập trình các tính năng cụ thể của trang web.

Middleware và Kết nối

Phục vụ các trang liên quan đến một số nhiệm vụ. Nhiều trong số các tác vụ đó được biết đến và rất phổ biến, vì vậy mô-đun Connect của nút (một trong nhiều mô-đun có sẵn để chạy dưới nút) thực hiện các tác vụ đó.
Xem cung cấp ấn tượng hiện tại:

  • logger yêu cầu logger với hỗ trợ định dạng tùy chỉnh
  • csrf Bảo vệ giả mạo yêu cầu chéo
  • nén phần mềm nén Gzip
  • BasicAuth cơ bản http authentication
  • bodyParser yêu cầu mở rộng trình phân tích cú pháp cơ thể
  • ứng dụng json / trình phân tích cú pháp json
  • urlencoded application / x-www-form-urlencoded phân tích cú pháp
  • bộ phân tích dữ liệu nhiều phần / biểu mẫu dữ liệu
  • hết thời gian chờ yêu cầu
  • cookieParser phân tích cú pháp Cookie
  • phiên hỗ trợ quản lý phiên làm việc với MemoryStore kèm
  • cookieSession hỗ trợ phiên dựa trên cookie
  • methodOverride giả HTTP hỗ trợ phương pháp
  • answerTime tính toán thời gian phản hồi và hiển thị thông qua X-Feedback-Time
  • Lớp bộ nhớ cache của bộ nhớ staticCache cho phần mềm trung gian static ()
  • tĩnh máy chủ streaming tệp tĩnh hỗ trợ Phạm vi và nhiều hơn nữa
  • thư mục danh sách trung gian
  • vhost máy chủ ảo trung gian ánh xạ tên miền phụ
  • Favicon máy chủ favicon hiệu quả (với biểu tượng mặc định)
  • giới hạn giới hạn byte của các cơ quan yêu cầu
  • truy vấn trình phân tích cú pháp chuỗi truy vấn tự động, điền vào req.query
  • errorHandler xử lý lỗi linh hoạt

Kết nối là khung và thông qua nó, bạn có thể chọn các mô-đun (phụ) bạn cần.
Trang Contrib Middleware liệt kê một danh sách dài các phần mềm trung gian bổ sung .
Express tự đi kèm với các phần mềm trung gian Connect phổ biến nhất.

Phải làm sao

Cài đặt node.js.
Nút đi kèm với npm , trình quản lý gói nút .
Lệnh npm install -g expresssẽ tải xuống và cài đặt express trên toàn cầu (kiểm tra hướng dẫn cấp tốc ).
Chạy express footrong một dòng lệnh (không phải trong nút) sẽ tạo ra một ứng dụng sẵn sàng để chạy có tên foo. Thay đổi thư mục (mới được tạo) của nó và chạy nó với nút bằng lệnh node <appname>, sau đó mở http://localhost:3000và xem. Bây giờ bạn đang ở trong.


3
trả lời tuyệt vời cảm ơn. Đây là loại tào lao đơn giản mà mỗi bài đăng blog bỏ lỡ, thiết lập đơn giản có thể ??? nếu bạn chưa bao giờ làm điều đó trước đây. Phải, thật đơn giản khi bạn đã thực hiện nó nhưng bạn không biết làm thế nào để bắt đầu lần đầu tiên! Tôi ghét nó khi các nhà phát triển bỏ qua rằng trong các bài đăng trên blog, nó rất cần thiết. Tôi không muốn phải TÌM một bài đăng blog khác chỉ để tìm thiết lập. Chỉ cần cung cấp một liên kết đến một bài đăng blog khác trong các bài đăng khác của bạn, điều đó cực kỳ hữu ích vì vậy tôi không phải tìm kiếm một bài đăng. Cứu tôi chuyến đi săn!
positiveGuy

3
Express 4.0.0 cần thực hiện cài đặt sudo npm -g express-tạo
mohamed-ibrahim

@getsetbro bạn chỉ có nghĩa là 'npm install' để cài đặt các phụ thuộc.
Torsten Barthel

16

Connect cung cấp API "cấp cao hơn" cho chức năng máy chủ HTTP phổ biến như quản lý phiên, xác thực, ghi nhật ký và hơn thế nữa. Express được xây dựng dựa trên chức năng Connect với chức năng nâng cao (giống Sinatra).


0

Node.jschính nó cung cấp một mô-đun HTTP, có phương thức createServer trả về một đối tượng mà bạn có thể sử dụng để đáp ứng các yêu cầu HTTP. Đối tượng đó kế thừa http.Servernguyên mẫu.


0

Thông tin liên quan, đặc biệt nếu bạn đang sử dụng NTVS để làm việc với Visual Studio IDE. NTVS bổ sung cả công cụ NodeJS và Express, giàn giáo, mẫu dự án vào Visual Studio 2012, 2013.

Ngoài ra, phiên bản gọi ExpressJS hoặc Connect là "Máy chủ web" là không chính xác. Bạn có thể tạo một Máy chủ Web cơ bản có hoặc không có chúng. Một chương trình NodeJS cơ bản cũng có thể sử dụng mô-đun http để xử lý các yêu cầu http, do đó trở thành một máy chủ web thô sơ.


0

phần mềm trung gian như tên cho thấy phần mềm trung gian thực sự nằm ở giữa .. giữa những gì? Giữa yêu cầu và phản hồi .. cách yêu cầu, phản hồi, máy chủ cấp tốc ngồi trong ứng dụng cấp tốc trong ảnh này bạn có thể thấy các yêu cầu đến từ máy khách sau đó máy chủ máy chủ cấp tốc phục vụ các yêu cầu đó .. sau đó hãy đào sâu hơn .. thực sự chúng ta có thể phân chia điều này toàn bộ nhiệm vụ của máy chủ thể hiện trong các nhiệm vụ riêng biệt nhỏ như cách này. Làm thế nào phần mềm trung gian ngồi giữa yêu cầu và phản hồi một phần nhỏ của các bộ phận máy chủ thực hiện một số nhiệm vụ cụ thể và chuyển yêu cầu đến phần tiếp theo .. cuối cùng thực hiện tất cả các phản hồi tác vụ đã được thực hiện .. tất cả các kho trung gian có thể truy cập đối tượng yêu cầu, đối tượng phản hồi và chức năng yêu cầu tiếp theo chu kỳ đáp ứng ..

đây là ví dụ điển hình để giải thích phần mềm trung gian trong video youtube thể hiện cho phần mềm trung gian


-7

Câu trả lời đơn giản ngu ngốc

Connect và Express là các máy chủ web cho nodejs. Không giống như Apache và IIS, cả hai đều có thể sử dụng cùng một mô-đun, được gọi là "phần mềm trung gian".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.