hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
      • NodeJS
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
      • MongoDB
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Machine Learning
    • Git và Github
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • NodeJS
Built-in Modules trong Node.js: HTTP Server, URL và EventEmitter

Built-in Modules trong Node.js: HTTP Server, URL và EventEmitter

  • 24-07-2026
  • Toanngo92
  • 0 Comments

Node.js có nhiều module tích hợp có thể dùng ngay mà không cần cài package. Trong số đó, node:http cung cấp HTTP server và client mức thấp, WHATWG URL xử lý địa chỉ web theo chuẩn trình duyệt, còn node:events cung cấp EventEmitter — nền tảng của kiến trúc hướng sự kiện trong hệ sinh thái Node.js.

Mục lục

  • 1. Built-in module là gì?
  • 2. Các đối tượng quan trọng của node:http
  • 3. Tạo HTTP server đầu tiên
  • 4. Routing theo method và URL
  • 5. Đọc request body có giới hạn
  • 6. Gửi HTTP request từ Node.js
  • 7. Phân tích và xây dựng URL đúng chuẩn
  • 8. EventEmitter và kiến trúc hướng sự kiện
  • 9. Checklist và bài tập

1. Built-in module là gì?

Built-in module, còn gọi là core module, được đóng gói cùng Node.js. Ta chỉ cần import bằng tiền tố node:, ví dụ node:http, node:url và node:events. Tiền tố này làm rõ nguồn gốc module và tránh nhầm với package bên thứ ba trùng tên.

ModuleVai trò chính
node:httpTạo HTTP server, gửi HTTP request và xử lý dữ liệu dạng stream.
node:urlPhân tích, xây dựng và biến đổi URL theo WHATWG URL Standard.
node:eventsPhát sự kiện có tên và đăng ký listener bằng EventEmitter.

2. Các đối tượng quan trọng của node:http

Các lớp Server ClientRequest và ServerResponse trong HTTP module của Node.js
Ba nhóm đối tượng thường gặp trong module HTTP: server, request phía client và response phía server.
  • http.Server: lắng nghe kết nối và phát sự kiện request cho mỗi HTTP request.
  • http.IncomingMessage: đại diện cho request ở phía server hoặc response ở phía client; đây là một readable stream.
  • http.ServerResponse: dùng để đặt status, header và gửi response.
  • http.ClientRequest: đại diện cho request gửi tới server khác; đây là một writable stream.

node:http là API mức thấp: nó phân tích HTTP message thành header và body dạng stream nhưng không tự parse JSON, validate dữ liệu, định tuyến hay quản lý session. Framework như Express bổ sung các lớp tiện ích này.

3. Tạo HTTP server đầu tiên

import { createServer } from 'node:http';

const host = '127.0.0.1';
const port = 3000;

const server = createServer((request, response) => {
  response.writeHead(200, {
    'content-type': 'text/plain; charset=utf-8',
  });
  response.end('Xin chào từ Node.js!');
});

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

server.on('error', (error) => {
  console.error('Không thể khởi động server:', error.message);
});

Chạy bằng node server.js, sau đó mở http://127.0.0.1:3000. Callback của createServer() nhận hai đối tượng: request và response. Luôn kết thúc response bằng response.end(); nếu không, client có thể tiếp tục chờ.

Khởi động HTTP server Node.js và xem phản hồi trên trình duyệt
HTTP server lắng nghe ở cổng 3000 và trả nội dung cho trình duyệt.

4. Routing theo method và URL

HTTP server thuần không có router. Ta phải kiểm tra request.method và URL, đồng thời đặt status code, content type phù hợp cho từng nhánh.

import { createServer } from 'node:http';

const server = createServer((request, response) => {
  const url = new URL(request.url ?? '/', 'http://localhost');

  if (request.method === 'GET' && url.pathname === '/') {
    response.writeHead(200, {
      'content-type': 'application/json; charset=utf-8',
    });
    response.end(JSON.stringify({ message: 'Node.js HTTP API' }));
    return;
  }

  if (request.method === 'GET' && url.pathname === '/hello') {
    const name = url.searchParams.get('name') || 'bạn';
    response.writeHead(200, {
      'content-type': 'text/plain; charset=utf-8',
    });
    response.end(`Xin chào ${name}`);
    return;
  }

  response.writeHead(404, {
    'content-type': 'application/json; charset=utf-8',
  });
  response.end(JSON.stringify({ error: 'Không tìm thấy tài nguyên' }));
});

server.listen(3000);
  • 200 OK: xử lý thành công.
  • 201 Created: tạo tài nguyên thành công.
  • 400 Bad Request: request không hợp lệ.
  • 404 Not Found: không có route hoặc tài nguyên.
  • 500 Internal Server Error: lỗi ngoài dự kiến ở phía server.

5. Đọc request body có giới hạn

Request body là stream và có thể đến theo nhiều chunk. Không nên nối dữ liệu vô hạn vào bộ nhớ. Ví dụ sau giới hạn JSON body ở 1 MB, kiểm tra content type và xử lý JSON không hợp lệ.

async function readJson(request, limit = 1_000_000) {
  if (!request.headers['content-type']?.startsWith('application/json')) {
    throw new Error('UNSUPPORTED_MEDIA_TYPE');
  }

  const chunks = [];
  let size = 0;

  for await (const chunk of request) {
    size += chunk.length;
    if (size > limit) throw new Error('PAYLOAD_TOO_LARGE');
    chunks.push(chunk);
  }

  try {
    return JSON.parse(Buffer.concat(chunks).toString('utf8'));
  } catch {
    throw new Error('INVALID_JSON');
  }
}

Trong production, cần thêm timeout, giới hạn header/body, logging, HTTPS hoặc reverse proxy, validation dữ liệu và quy trình tắt server có kiểm soát.

6. Gửi HTTP request từ Node.js

http.get() phù hợp với GET đơn giản; http.request() cho phép kiểm soát method, header và body. Response phía client cũng là readable stream.

import { get } from 'node:https';

const request = get('https://jsonplaceholder.typicode.com/todos/1', (response) => {
  const chunks = [];

  response.on('data', (chunk) => chunks.push(chunk));
  response.on('end', () => {
    const body = Buffer.concat(chunks).toString('utf8');

    if (response.statusCode !== 200) {
      console.error('HTTP status:', response.statusCode);
      return;
    }

    console.log(JSON.parse(body));
  });
});

request.setTimeout(5_000, () => {
  request.destroy(new Error('Request timeout'));
});

request.on('error', (error) => {
  console.error(error.message);
});

Trong Node.js hiện đại, global fetch() thường thuận tiện hơn cho API JSON. Tuy nhiên, hiểu node:http vẫn quan trọng vì nhiều framework và thư viện mạng được xây dựng trên stream, event và socket của Node.js.

7. Phân tích và xây dựng URL đúng chuẩn

Node.js cung cấp WHATWG URL giống trình duyệt. API cũ url.parse() đã bị deprecate và không nên dùng với dữ liệu không tin cậy; hãy tạo đối tượng bằng new URL(input, base).

Các thuộc tính protocol host hostname pathname port và hash của URL
Đối tượng URL tách địa chỉ thành protocol, host, pathname, port, search và hash.
const url = new URL(
  '/todos/61?completed=false#details',
  'https://api.example.com:8443',
);

console.log(url.href);       // URL hoàn chỉnh
console.log(url.origin);     // https://api.example.com:8443
console.log(url.protocol);   // https:
console.log(url.hostname);   // api.example.com
console.log(url.port);       // 8443
console.log(url.pathname);   // /todos/61
console.log(url.searchParams.get('completed')); // false
console.log(url.hash);       // #details

url.searchParams.set('page', '2');
console.log(url.toString());

Ở HTTP server, request.url thường chỉ chứa path và query nên cần một base URL đáng tin cậy. Không nên ghép mù quáng header Host hoặc X-Forwarded-Host vào URL nếu proxy chưa được cấu hình và xác thực đúng.

8. EventEmitter và kiến trúc hướng sự kiện

Nhiều API Node.js phát sự kiện: server phát request, stream phát data/end, socket phát connect. EventEmitter cho phép ứng dụng tự định nghĩa cơ chế tương tự.

Các ứng dụng và phương thức on once emit removeListener của EventEmitter
EventEmitter đăng ký listener bằng on/once và phát sự kiện bằng emit.
import { EventEmitter } from 'node:events';

class NotificationBus extends EventEmitter {}

const bus = new NotificationBus();

function logNotification(notification) {
  console.log('Thông báo:', notification.message);
}

bus.on('notification', logNotification);
bus.once('ready', () => console.log('Bus đã sẵn sàng'));
bus.on('error', (error) => console.error('Bus error:', error.message));

bus.emit('ready');
bus.emit('ready'); // listener once không chạy lần hai
bus.emit('notification', { message: 'Lịch học đã thay đổi' });

bus.off('notification', logNotification);
  • on(): listener chạy mỗi lần sự kiện phát ra.
  • once(): listener tự gỡ sau lần chạy đầu tiên.
  • emit(): gọi các listener theo thứ tự đăng ký.
  • off()/removeListener(): gỡ đúng function đã đăng ký.
  • Sự kiện error cần listener; nếu không, process có thể bị kết thúc.
Nhiều listener on và once cùng xử lý một sự kiện trong Node.js
Nhiều listener có thể cùng phản ứng với một sự kiện; listener once chỉ chạy lần đầu.

emit() gọi listener một cách đồng bộ. Nếu listener thực hiện tính toán lâu, nó vẫn chặn luồng JavaScript. “Hướng sự kiện” không đồng nghĩa mọi listener tự động chạy song song.

9. Checklist và bài tập

  • Dùng tiền tố node: cho built-in module.
  • Luôn đặt status code và Content-Type chính xác.
  • Kết thúc response và xử lý sự kiện error.
  • Giới hạn kích thước body; không buffer dữ liệu vô hạn.
  • Dùng WHATWG URL thay cho url.parse().
  • Gỡ listener khi vòng đời component kết thúc để tránh rò rỉ bộ nhớ.
  1. Tạo server trả JSON tại /api/status và trả 404 cho route khác.
  2. Thêm route /hello?name=Lan bằng URLSearchParams.
  3. Viết POST route nhận JSON body tối đa 100 KB.
  4. Tạo EventEmitter phát các sự kiện user:joined, user:left và error.
  5. Giải thích vì sao listener chạy lâu có thể làm server phản hồi chậm.

Tóm lại: node:http, WHATWG URL và EventEmitter minh họa rõ cách Node.js kết hợp stream với event. Nắm chắc ba phần này giúp bạn hiểu HTTP server thuần, sử dụng framework hiệu quả và xử lý đúng các tình huống lỗi, tải lớn hoặc nhiều listener.

Bài viết liên quan:

Query String, gửi Email, Upload File và Local Modules trong Node.js
Modules và Packages trong Node.js: CommonJS, ES Modules, npm và File System
Node.js Essentials: kiến trúc, Event Loop, REPL, npm và Global Objects
Xây dựng RESTful API với Express và HTTP trong nodejs
Node.js là gì? Kiến trúc client-server và cách cài đặt Node.js
Tìm Hiểu Express.js và Lập Trình Đồng Bộ – Bất Đồng Bộ Trong Node.js
Tìm hiểu Modules, Packages và Built-in Modules trong Node.js
Giới thiệu tổng quan về ứng dụng Server Side
Cài đặt NodeJS trên môi trường windows

THÊM BÌNH LUẬN Cancel reply

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

Built-in Modules trong Node.js: HTTP Server, URL và EventEmitter

Query String, gửi Email, Upload File và Local Modules trong Node.js

Modules và Packages trong Node.js: CommonJS, ES Modules, npm và File System

Node.js Essentials: kiến trúc, Event Loop, REPL, npm và Global Objects

Xây dựng RESTful API với Express và HTTP trong nodejs

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×