Contents
Cách sử dụng trình kiểm tra Node Inspector
Nếu bạn chủ yếu sử dụng printf, aka caveman debugging, có thể rất khó để tìm đúng giá trị vào đúng thời điểm app NodeJS.
Mọi thứ thậm chí còn tồi tệ hơn nếu bạn phải xây dựng lại image container của mình để thêm console.log
vào nó. Có thể dễ dàng hơn rất nhiều khi image được tạo một lần và ta có thể kiểm tra các biến trong khi nó đang chạy. Để hiểu rõ hơn những gì chúng ta sẽ làm ở đây, bạn cần làm quen với node inspect
Để chạy ứng dụng NodeJS của bạn ở chế độ gỡ lỗi, chỉ cần thêm inspect
sau node
:
$ node inspect index.js
< Debugger listening on ws://127.0.0.1:9229/5adb6217-0757-4761-95a2-6af0955d7d25
< For help, see: https://nodejs.org/en/docs/inspector
< Debugger attached.
Break on start in index.js:1
> 1 (function (exports, require, module, __filename, __dirname) { const http = require('http')
2 const PORT = process.env.PORT || 3000
3
debug>
Khi bạn chạy ở chế độ inspect, nó luôn dừng ở dòng đầu tiên, chờ bạn tương tác với nó. Tuy nhiên, nếu bạn đã quen với việc tương tác với trình gỡ lỗi của mình bằng GUI, bạn có thể dùng chrome và đến chrome://inspect
.
Bạn sẽ thấy một cái gì đó như thế này:

Nhập phải chọn inspect
và bạn sẽ thấy trình gỡ lỗi dành cho nhà phát triển Chrome.

Bây giờ bạn có thể sử dụng trình gỡ lỗi như bạn muốn. Đã đến lúc bọc ứng dụng của chúng ta trong một container.
Debug NodeJS trong Docker container
Trước tiên, chúng ta sẽ cần tạo Dockerfile,
FROM node
COPY package.json package.json
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "."]
và một docker-compose.yaml
version: '3.6'
services:
app:
build: .
ports:
- "3000:3000"
Bây giờ nếu bạn chạy docker-compose up
, bạn sẽ có thể xem kết quả tại url http://localhost:3000
.
Bước tiếp theo là đưa “port” debug ra thế giới bên ngoài. Đầu tiên, hãy tạo một debug-compose.yaml
.
version: '3.6'
services:
app:
build: .
ports:
- "3000:3000"
- "9229:9229"
command:
- node
- "--inspect-brk=0.0.0.0"
- "."
Chúng ta đã mở cổng 9229, đó là cổng gỡ lỗi của các ứng dụng NodeJS. Chúng ta cũng ghi đè lệnh đã chỉ định trong Dockerfile
. Đối --inspect-brk=0.0.0.0
số thực hiện hai điều khác nhau:
--inspect
nói với NodeJS rằng chúng ta muốn chạy ứng dụng của mình ở chế độ gỡ lỗi.- Bằng cách thêm
-brk
chúng ta cũng đảm bảo rằng ứng dụng dừng ở dòng đầu tiên. - Thêm
=0.0.0.0
mở ra trình gỡ lỗi cho các kết nối từ bất kỳ IP nào.
Theo mặc định, inspector bị ràng buộc bởi 127.0.0.1
điều này quan trọng, vì chúng ta thường không muốn cho phép mọi người từ khắp nơi trên thế giới gắn trình gỡ lỗi vào ứng dụng của mình. Tuy nhiên, container là một máy chủ khác có IP khác với máy chủ của chúng ta, vì vậy sẽ không thể truy cập được.
Lưu ý: đừng dại dột làm điều này trên production nhé :v
Vì lý do này, chắc chắn rằng đó là một file khác với file mặc định docker-compose.yaml
( dùng chạy trên server ) .

Gỡ lỗi với Visual Studio Code
Đầu tiên, ta nhìn vào thanh menu và đến tab gỡ lỗi ( chổ có hình con crep – và bắt đầu farm :v )

sau đó nhấp vào biểu tượng bánh răng

từ danh sách bật lên, chọn docker (đảm bảo, bạn đã cài đặt tiện ích mở rộng Docker )

nó sẽ tạo launch.json NodeJS trong .vscode
thư mục dự án trông như thế này:

Ở đây ta cần thay đổi thuộc tính “remoteRoot” cho phù hợp – tuỳ vào môi trường của bạn
{
"name": "Docker: Attach to Node",
"type": "node",
"request": "attach",
"port": 9229,
"address": "localhost",
"localRoot": "${workspaceFolder}",
"remoteRoot": "/",
"protocol": "inspector"
}
Bây giờ, nếu bạn nhấn F5 trên bàn phím, bạn sẽ được nhắc với trình gỡ lỗi mà bạn đã quen với VSCode. Nhấn F5 một lần nữa, để cho máy chủ bắt đầu nghe. Nếu bạn đặt một break point ở đâu đó và gọi máy chủ tại http://localhost:3000
bạn sẽ thấy ngay điều kỳ diệu

Suy nghĩ cuối cùng về gỡ lỗi NodeJS
Các công nghệ container như Kubernetes, AWS ECS, Docker Swarm và các công nghệ khác đang ngày càng lan rộng cùng tất cả những tiện ích nó mang đến, có thể thấy rõ rằng thời của container đang đến.
Trong trường hợp bạn cần hướng dẫn với Docker, Kubernetes, microservice hoặc NodeJS, vui lòng inbox tôi qua messenger tại góc phải dưới màn hình.
Tham khảo thêm về log NodeJS tại đây : Logs NodeJS là gì ? Và tại sao nên dùng ?
Chúc bạn may mắn và ngày càng có nhiều lỗi để debug :v

Kinh nghiệm hơn 15 năm lập trình ứng dụng web app, mobile.
Chuyên thiết kế xây dưng, tư vấn giải pháp, quản lý dự án cho các hệ thống lớn, phân tán, chịu tải cao như sàn thương mại điện tử, NFT Platform, ERP, AWS solution architect.