Hướng sự kiện của nodejs

Là một thời gian chạy JavaScript hướng sự kiện không đồng bộ, Node. js được thiết kế để xây dựng các ứng dụng mạng có thể mở rộng. Trong ví dụ "hello world" sau đây, nhiều kết nối có thể được xử lý đồng thời. Sau mỗi kết nối, cuộc gọi lại sẽ được kích hoạt, nhưng nếu không có việc gì phải hoàn thành, Node. js sẽ ngủ

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Điều này trái ngược với mô hình đồng thời phổ biến hơn hiện nay, trong đó các luồng hệ điều hành được sử dụng. Mạng dựa trên luồng tương đối kém hiệu quả và rất khó sử dụng. Hơn nữa, người dùng của Node. js không phải lo lắng về việc khóa chết quy trình, vì không có khóa. Hầu như không có chức năng trong Node. js trực tiếp thực hiện I/O, do đó, quy trình không bao giờ bị chặn trừ khi I/O được thực hiện bằng các phương thức đồng bộ của Node. thư viện chuẩn js. Bởi vì không có khối nào, các hệ thống có thể mở rộng rất hợp lý để phát triển trong Node. js

Nếu một số ngôn ngữ này không quen thuộc, có một bài viết đầy đủ về Chặn so với. Không chặn


Nút. js có thiết kế tương tự và bị ảnh hưởng bởi các hệ thống như Ruby's Event Machine và Python's Twisted. Nút. js đưa mô hình sự kiện đi xa hơn một chút. Nó trình bày một vòng lặp sự kiện dưới dạng cấu trúc thời gian chạy thay vì dưới dạng thư viện. Trong các hệ thống khác, luôn có một cuộc gọi chặn để bắt đầu vòng lặp sự kiện. Thông thường, hành vi được xác định thông qua các cuộc gọi lại ở phần đầu của tập lệnh và ở phần cuối, một máy chủ được bắt đầu thông qua một cuộc gọi chặn như EventMachine::run(). trong nút. js, không có cuộc gọi vòng lặp bắt đầu sự kiện như vậy. Nút. js chỉ cần vào vòng lặp sự kiện sau khi thực thi tập lệnh đầu vào. Nút. js thoát khỏi vòng lặp sự kiện khi không còn lệnh gọi lại nào để thực hiện. Hành vi này giống như JavaScript của trình duyệt — vòng lặp sự kiện bị ẩn khỏi người dùng

HTTP là công dân hạng nhất trong Node. js, được thiết kế với tính năng phát trực tuyến và độ trễ thấp. Điều này làm cho nút. js rất phù hợp cho nền tảng của thư viện web hoặc khung

Nút. js được thiết kế không có luồng không có nghĩa là bạn không thể tận dụng lợi thế của nhiều lõi trong môi trường của mình. Các quy trình con có thể được sinh ra bằng cách sử dụng API của chúng tôi và được thiết kế để dễ dàng giao tiếp với. Được xây dựng trên cùng một giao diện đó là mô-đun cluster, cho phép bạn chia sẻ các ổ cắm giữa các quy trình để cho phép cân bằng tải trên các lõi của bạn

trong nút. js, các khái niệm Sự kiện và Gọi lại được sử dụng để cung cấp đồng thời. Là nút. các ứng dụng js là một luồng và mọi API của Node js đều không đồng bộ. Vì vậy, nó sử dụng chức năng async để duy trì đồng thời. Nút sử dụng mẫu quan sát viên. Chuỗi nút giữ một vòng lặp sự kiện và sau khi hoàn thành bất kỳ tác vụ nào, nó sẽ kích hoạt sự kiện tương ứng để báo hiệu chức năng lắng nghe sự kiện được thực thi

Lập trình hướng sự kiện

Nút. js sử dụng lập trình hướng sự kiện. Điều đó có nghĩa là ngay khi Node khởi động máy chủ của nó, nó chỉ cần khởi tạo các biến của nó, khai báo các hàm và sau đó chỉ cần đợi sự kiện xảy ra. Đó là một trong những lý do tại sao Node. js khá nhanh so với các công nghệ tương tự khác

Có một vòng lặp chính trong ứng dụng hướng sự kiện lắng nghe các sự kiện và sau đó kích hoạt chức năng gọi lại khi một trong những sự kiện đó được phát hiện

Hướng sự kiện của nodejs

Sự khác biệt giữa Sự kiện và Cuộc gọi lại

Mặc dù, Sự kiện và Cuộc gọi lại trông giống nhau nhưng sự khác biệt nằm ở chỗ các hàm gọi lại được gọi khi một hàm không đồng bộ trả về kết quả của nó khi xử lý sự kiện hoạt động trên mẫu quan sát viên. Bất cứ khi nào một sự kiện được kích hoạt, hàm nghe của nó sẽ bắt đầu thực thi. Nút. js có sẵn nhiều sự kiện dựng sẵn thông qua mô-đun sự kiện và lớp EventEmitter được sử dụng để liên kết các sự kiện và trình xử lý sự kiện

Theo định nghĩa, NodeJS là một môi trường thời gian chạy không chặn theo sự kiện dành cho JavaScript đã trở nên rất phổ biến ở phía máy chủ. Điều này là do Nodejs có kiến ​​trúc hướng sự kiện có khả năng I/O không đồng bộ. Bài đăng này khám phá kiến ​​trúc hướng sự kiện này là như thế nào và cách khai thác bản chất hướng sự kiện của Nodejs theo cách rất đơn giản và cơ bản

Bài viết này dành cho ai?

Nếu bạn đã từng lập trình trong Nodejs, thì bài đăng này là dành cho bạn vì với các thư viện và framework có sẵn trong cộng đồng npmjs, hầu hết các nhà phát triển không bao giờ có nhu cầu trải nghiệm khả năng điều khiển cốt lõi của Nodejs. Nếu bạn chưa quen với Nodejs, hướng dẫn dành cho người mới bắt đầu này rất phù hợp với bạn. Là người mới bắt đầu, bạn cũng có thể xem qua hướng dẫn này mặc dù bạn có thể thấy khó khăn nhưng bạn sẽ bắt đầu đúng cách. Dù bằng cách nào, bạn sẽ biết được Nodejs tuyệt vời như thế nào khi được tiếp cận từ hướng này

nghiên cứu điển hình

Trước khi bắt đầu lập trình hướng sự kiện, hãy tìm một vấn đề yêu cầu chúng ta sử dụng sự kiện. Tôi chỉ có một ý tưởng hoàn hảo. Hãy tưởng tượng bạn có hai giao diện. Máy khách HTTP, ví dụ: trình duyệt web và giao diện TCP, ví dụ: một vị trí rất nguyên khối chỉ chấp nhận các thông báo TCP dựa trên luồng

Theo giao thức, có hai điều rõ ràng khiến việc thiết lập trên không thể thực hiện được

  1. Máy khách HTTP chỉ biết cách gửi yêu cầu HTTP và nhận phản hồi HTTP trong khi giao diện TCP chỉ biết cách nhận tin nhắn được viết trên a và trả lời tin nhắn đó bằng một tin nhắn khác ở chế độ dựa trên luồng
  2. Máy khách HTTP chỉ có thể giao tiếp với máy chủ web HTTP trong khi giao diện TCP chỉ có thể giao tiếp với máy khách TCP thông qua

Sử dụng các sự kiện để giải quyết vấn đề

Để giải quyết vấn đề này, chúng ta phải giới thiệu hai thực thể. Máy chủ web và Máy khách TCP đóng vai trò trung gian

Vì vậy, với thiết kế mới, chúng tôi có ứng dụng khách HTTP gửi yêu cầu đến máy chủ web sử dụng ứng dụng khách TCP để ghi thông báo vào ổ cắm kết nối với máy chủ TCP, khi nhận được thông báo luồng sẽ ghi lại vào ổ cắm. Bạn sẽ nhận thấy rằng ở lớp ổ cắm TCP, mọi thứ đều dựa trên sự kiện. Bây giờ, trình xử lý yêu cầu của máy chủ web phải sử dụng các sự kiện để đợi thông báo tại máy khách, đồng thời phải sử dụng một sự kiện để thông báo cho máy chủ web khi máy chủ TCP ghi lại thông báo phản hồi

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

Bây giờ chúng ta có một vấn đề cần giải quyết và chúng ta biết cách giải quyết nó, hãy bắt đầu viết một số trình xử lý sự kiện và trình phát sự kiện thú vị. Trước khi chúng tôi bắt đầu, đây là một số điều cần xem lại

  1. ES6. Bài đăng này sử dụng một số tính năng mới nhất của JS được mô tả trong phần nổi bật về các tính năng ES6 hàng đầu này
  2. Mạng Nodejs. Vì vấn đề của chúng tôi sử dụng TCP thô, nên chúng tôi cần mô-đun mạng Nodejs. Mô-đun này cũng hoàn toàn dựa trên sự kiện, giúp việc sử dụng mô-đun này trở thành một trải nghiệm học tập tốt cho lập trình hướng sự kiện
  3. Expressjs. Chúng tôi sử dụng express làm máy chủ web mặc dù chúng tôi có thể tạo một máy chủ cho chính mình như máy chủ này tại đây
  4. Sự kiện Nodejs. Mô-đun này sẽ giao diện TCP và HTTP
Một bức tranh lớn ngắn gọn về các sự kiện Nodejs

Nút là một luồng và đạt được kiến ​​trúc không chặn thông qua một vòng lặp sự kiện. Vì vậy, mỗi chức năng được thực thi khi phát ra một sự kiện. Đây là ý tưởng cơ bản mà chúng tôi muốn thấy ở đây

Được rồi, bây giờ chúng tôi có mọi thứ chúng tôi cần, hãy bắt đầu ngay

Máy khách TCP và máy chủ TCP

Hãy tạo máy khách và máy chủ TCP mà chúng tôi sẽ kết nối với máy khách HTTP

Đối với máy chủ TCP, đây là những gì chúng ta sẽ có. Máy chủ này lắng nghe trên một cổng mà chúng tôi có thể kết nối và nhận thông tin về mã trạng thái HTTP. Bạn sẽ nhận thấy rằng tất cả mã ở đây đều dựa trên sự kiện như khi một kết nối mới được tạo, sự kiện connection được phát ra và trình nghe được gọi với ổ cắm được liên kết với kết nối làm đối số. Điều tương tự cũng áp dụng cho những người đăng ký như dữ liệu, lỗi, v.v. được tạo để nghe trên ổ cắm

Bây giờ chúng tôi có máy chủ TCP, hãy kiểm tra nó. Đầu tiên, chạy máy chủ. Nếu bạn đang ở trên windows, chỉ cần kích hoạt putty và chọn telnet rồi nhập 127. 0. 0. 1 trong tên máy chủ và 9670 làm cổng. như hình dưới đây. Nhấp vào mở, bạn sẽ có một thiết bị đầu cuối mới giống như một cửa sổ. Nhập 404 hoặc 500 sẽ tạo một cuộc trò chuyện qua ổ cắm được tạo

Nếu bạn đang dùng Unix, telnet sẽ xuất hiện theo mặc định. Nếu không google lên gói nào có telnet cho HĐH của bạn. Cuối cùng bạn sẽ có thể phát hành

telnet 127.0.0.1 9670

Điều này sẽ mở một kết nối có thể ghi như thế này

Làm thế nào về một ứng dụng khách TCP trong Nodejs. Chúng tôi cần một máy khách TCP sẽ được máy chủ web sử dụng để liên lạc với máy chủ TCP. Khách hàng sẽ trông như thế này

Bạn nên lưu ý rằng chúng tôi không có trình xử lý sự kiện on data trong ứng dụng khách này. Điều này là có chủ đích vì trình nghe dữ liệu sẽ được tạo tại tệp máy chủ web. Đây là lý do tại sao chúng tôi đã xuất ứng dụng khách. Khi bạn tự chạy ứng dụng khách, nó sẽ kết nối tốt với máy chủ

Tạo máy chủ web

Cài đặt express và tạo máy chủ chỉ với một điểm cuối. Chúng tôi gọi máy chủ với mã trạng thái truy vấn là mã mà chúng tôi muốn nhận mô tả của nó từ máy chủ TCP. Máy chủ web sẽ lấy mã trong truy vấn và ghi nó vào ổ cắm. Sau đó đợi tin nhắn phản hồi. Chúng tôi sẽ sử dụng mô-đun sự kiện Nodejs để thực hiện công việc này. Đây là mã hoàn chỉnh của máy chủ web

Bây giờ như bạn có thể thấy, chúng tôi sử dụng mô-đun sự kiện Nodejs để tạo trình xử lý sự kiện sau khi ghi vào ổ cắm. Trình lắng nghe sự kiện đang chờ một sự kiện có tên là mã được gửi trong truy vấn trạng thái. Khi ứng dụng khách TCP nhận được phản hồi thông qua trình xử lý sự kiện dữ liệu của nó, chúng tôi phát ra một sự kiện có tên là mã trạng thái mà chúng tôi nhận được từ yêu cầu HTTP. Đây là đoạn mã của một yêu cầu mẫu tới máy chủ này sẽ hoạt động khi máy chủ TCP đang chạy

curl localhost:8090?statusCode=500

Bây giờ chúng tôi có một ứng dụng dựa trên sự kiện đang hoạt động hoàn chỉnh. Tuy nhiên, lập trình dựa trên sự kiện đi kèm với rất nhiều trách nhiệm

Những điều quan trọng cần ghi nhớ
  1. Rò rỉ bộ nhớ. Thông thường JavaScript hầu như không quản lý bộ nhớ. Nhưng khi bạn bắt đầu sử dụng các mô-đun lõi của Nodejs như mạng, sự kiện và luồng, một số mức quản lý bộ nhớ sẽ rất tiện dụng
  2. Sự đơn giản. Với tất cả các loại trình nghe và trình phát này, bạn rất dễ bị lạc trong mã của chính mình cho dù nó có thể đơn giản đến đâu. Ở đây đơn giản, mô-đun và trừu tượng sẽ giúp ích nhiều nhất
  3. Không sử dụng chức năng ẩn danh với người nghe. Theo kinh nghiệm của tôi, bạn sẽ luôn muốn chấm dứt trình xử lý/trình xử lý sự kiện trong bộ nhớ, nhưng điều này trở nên khó khăn khi trình xử lý là một chức năng ẩn danh. Thay vào đó, hãy sử dụng các hàm được đặt tên
  4. Gỡ lỗi sử dụng bộ nhớ của ứng dụng trước khi triển khai. Điều này sẽ giúp bạn giải quyết rất nhiều rắc rối trong tương lai
Ngoài bài viết này

Bạn có thể thích bài đăng này và bạn đang hỏi điều gì tiếp theo sau khi biết cách thực thi mã hoàn toàn dựa trên sự kiện. Vâng, đây là một vài điều mà tôi vẫn đang xem xét

Là sự kiện mạng Node

Theo định nghĩa, NodeJS là môi trường thời gian chạy không chặn dựa trên sự kiện dành cho JavaScript đã trở nên rất phổ biến ở phía máy chủ. Điều này là do Nodejs có kiến ​​trúc hướng sự kiện có khả năng I/O không đồng bộ.

NodeJS có vòng lặp sự kiện không?

Vòng lặp sự kiện là thứ cho phép Node. js để thực hiện các thao tác I/O không chặn — mặc dù thực tế là JavaScript là một luồng — bằng cách giảm tải các thao tác cho nhân hệ thống bất cứ khi nào có thể. Vì hầu hết các kernel hiện đại đều đa luồng, chúng có thể xử lý nhiều thao tác thực thi trong nền.

NodeJS có phải không

Nút. js dựa trên mô hình I/O không chặn hướng sự kiện .

NodeJS có tốt cho việc xử lý dữ liệu không?

Nút. js cho phép nhà phát triển viết JavaScript cả trên máy chủ và máy khách, do đó giúp dễ dàng gửi dữ liệu giữa máy chủ và máy khách để tự động đồng bộ hóa dữ liệu . Meteor một khung ứng dụng web được xây dựng trên Node. js thực thi cùng một cơ sở mã trên cả máy khách và máy chủ.