Phát triển phần mềm rất phức tạp và tại một số điểm, ứng dụng Node.js của bạn sẽ thất bại. Nếu bạn may mắn, mã của bạn sẽ bị sập với một thông báo lỗi rõ ràng. Nếu bạn không may mắn, ứng dụng của bạn sẽ tiếp tục bất kể nhưng không tạo ra kết quả mà bạn mong đợi. Nếu bạn thực sự không may mắn, mọi thứ sẽ hoạt động tốt cho đến khi người dùng đầu tiên phát hiện ra lỗi xóa đĩa nghiêm trọng.
Gỡ lỗi là gì?
Gỡ lỗi là nghệ thuật đen của sửa chữa lỗi phần mềm. Sửa một lỗi thường dễ dàng - một ký tự được sửa hoặc dòng mã bổ sung sẽ giải quyết vấn đề. Phát hiện ra lỗi đó là một vấn đề khác và các nhà phát triển có thể mất nhiều giờ không vui khi cố gắng xác định nguồn gốc của một vấn đề. May mắn thay, Node.js có một số công cụ tuyệt vời để giúp theo dõi lỗi.
Thuật ngữ
Gỡ lỗi có lựa chọn riêng của biệt ngữ tối nghĩa, bao gồm:
Hạn | Giải thích |
---|---|
breakpoint | điểm mà trình gỡ lỗi dừng chương trình để trạng thái của nó có thể được kiểm tra |
trình sửa lỗi | một công cụ cung cấp các phương tiện gỡ lỗi như chạy mã theo từng dòng để kiểm tra các trạng thái biến nội bộ |
tính năng | như trong tuyên bố: Đây không phải là một lỗi, đó là một tính năng. Tất cả các nhà phát triển nói điều đó tại một số điểm trong sự nghiệp của họ |
tần số | mức độ thường xuyên hoặc trong những điều kiện một lỗi sẽ xảy ra |
nó không hoạt động | báo cáo lỗi thường được thực hiện nhưng ít hữu ích nhất |
điểm đăng nhập | một hướng dẫn cho trình gỡ lỗi để hiển thị giá trị của biến tại một điểm trong khi thực hiện |
khai thác gỗ | xuất thông tin thời gian chạy đến bàn điều khiển hoặc tập tin |
lỗi logic | chương trình hoạt động nhưng không hoạt động như dự định |
ưu tiên | nơi một lỗi được phân bổ trên một danh sách các bản cập nhật theo kế hoạch |
điều kiện của cuộc đua | lỗi khó theo dõi phụ thuộc vào trình tự hoặc thời gian của các sự kiện không thể kiểm soát |
refactoring | viết lại mã để giúp dễ đọc và bảo trì |
hồi quy | tái xuất hiện một lỗi đã được sửa trước đó có lẽ do các bản cập nhật khác |
liên quan | một lỗi tương tự hoặc liên quan đến lỗi khác |
tái sản xuất | các bước cần thiết để gây ra lỗi |
Lỗi RTFM | sự không đủ năng lực của người dùng được ngụy trang thành một báo cáo lỗi, thường được theo sau bởi một phản hồi cho trang Read Read Lật Hướng dẫn sử dụng |
bước vào | khi chạy từng dòng mã trong trình gỡ lỗi, bước vào hàm được gọi |
bước ra khỏi | khi chạy từng dòng một, hoàn thành thực hiện chức năng hiện tại và trở về mã gọi |
bước qua | khi chạy từng dòng một, hoàn thành thực thi một lệnh mà không cần bước vào một chức năng mà nó gọi |
mức độ nghiêm trọng | tác động của một lỗi trên hệ thống. Ví dụ, mất dữ liệu thường được coi là có vấn đề hơn so với sự cố UI trừ khi tần suất xuất hiện rất thấp |
dấu vết ngăn xếp | danh sách lịch sử của tất cả các chức năng được gọi trước khi xảy ra lỗi |
lỗi cú pháp | lỗi đánh máy, chẳng hạn như console.lug() |
lỗi người dùng | lỗi do người dùng thay vì ứng dụng, nhưng vẫn có thể phải chịu cập nhật tùy thuộc vào thâm niên của người đó |
đồng hồ đeo tay | một biến để kiểm tra trong quá trình thực thi trình gỡ lỗi |
quan điểm | tương tự như một điểm dừng, ngoại trừ chương trình bị dừng khi một biến được đặt thành một giá trị cụ thể |
Làm thế nào để tránh lỗi
Lỗi thường có thể được ngăn chặn trước khi bạn kiểm tra ứng dụng của mình
Sử dụng Trình chỉnh sửa mã tốt
Một trình soạn thảo mã tốt sẽ cung cấp nhiều tính năng bao gồm đánh số dòng, tự động hoàn thành, mã màu, khớp khung, định dạng, tự động thụt lề, đổi tên biến, tái sử dụng đoạn mã, kiểm tra đối tượng, điều hướng chức năng, nhắc nhở tham số, tái cấu trúc, phát hiện mã không thể truy cập, đề xuất, kiểm tra loại, và nhiều hơn nữa.
Các nhà phát triển Node.js được tha hồ lựa chọn với các trình soạn thảo miễn phí như Mã VS, Nguyên tửvà Chân đế, cũng như nhiều lựa chọn thay thế thương mại.
Sử dụng một Linter Code
Một kẻ nói dối có thể báo cáo lỗi mã như lỗi cú pháp, thụt lề kém, biến không được khai báo và dấu ngoặc không khớp trước khi bạn lưu và kiểm tra mã của mình. Các tùy chọn phổ biến cho JavaScript và Node.js bao gồm Tiếng Anh, Mã thông báovà Mã não.
Chúng thường được cài đặt dưới dạng các mô đun Node.js toàn cầu để bạn có thể chạy kiểm tra từ dòng lệnh:
eslint myfile.js
Tuy nhiên, hầu hết các linters đều có plugin trình chỉnh sửa mã, chẳng hạn như Tiếng Anh cho mã VS và kẻ nói dối cho nguyên tử Kiểm tra mã của bạn khi bạn nhập:
Kiểm soát nguồn sử dụng
Một hệ thống kiểm soát nguồn như đi có thể giúp bảo vệ an toàn mã của bạn và quản lý sửa đổi. Nó trở nên dễ dàng hơn để khám phá nơi và khi một lỗi được giới thiệu và ai sẽ nhận lỗi! Các kho lưu trữ trực tuyến như GitHub và Cai Xô nhỏ cung cấp không gian miễn phí và các công cụ quản lý.
Thông qua một hệ thống theo dõi vấn đề
Có một lỗi tồn tại nếu không ai biết về nó? Một hệ thống theo dõi vấn đề được sử dụng để báo cáo lỗi, tìm các bản sao, các bước tái tạo tài liệu, xác định mức độ nghiêm trọng, tính toán mức độ ưu tiên, chỉ định nhà phát triển, thảo luận hồ sơ và theo dõi tiến trình của bất kỳ bản sửa lỗi nào.
Kho lưu trữ nguồn trực tuyến thường cung cấp theo dõi vấn đề cơ bản, nhưng giải pháp chuyên dụng có thể thích hợp cho các nhóm và dự án lớn hơn.
Sử dụng Phát triển dựa trên thử nghiệm
Hướng phát triển thử nghiệm (TDD) là một quy trình phát triển khuyến khích các nhà phát triển viết mã kiểm tra hoạt động của một chức năng trước khi nó được viết - ví dụ: là X được trả về khi hàm Y được truyền vào đầu vào Z.
Các thử nghiệm có thể được chạy khi mã được phát triển để chứng minh một chức năng hoạt động và phát hiện bất kỳ vấn đề nào khi các thay đổi tiếp theo được thực hiện. Điều đó nói rằng, các bài kiểm tra của bạn có thể có lỗi quá.
Bước đi
Thật khó để thức suốt đêm trong một nỗ lực vô ích để xác định nguồn gốc của một lỗi khó chịu. Đừng. Bước đi và làm một cái gì đó khác. Bộ não của bạn sẽ vô thức xử lý vấn đề và đánh thức bạn lúc 4 giờ sáng với một giải pháp. Ngay cả khi điều đó không xảy ra, đôi mắt mới sẽ phát hiện ra dấu chấm phẩy bị thiếu rõ ràng đó.
Gỡ lỗi Node.js: Biến môi trường
Biến môi trường được đặt trong hệ điều hành máy chủ có thể được sử dụng để kiểm soát cài đặt ứng dụng Node.js. Phổ biến nhất là NODE_ENV
, thường được đặt thành development
khi gỡ lỗi.
Các biến môi trường có thể được đặt trên Linux / macOS:
NODE_ENV=development
Windows cmd
:
set NODE_ENV=development
Hoặc Windows Powershell:
$env:NODE_ENV="development"
Trong nội bộ, một ứng dụng sẽ cho phép các tính năng và thông báo gỡ lỗi thêm. Ví dụ:
// is NODE_ENV set to "development"?
const DEVMODE = (process.env.NODE_ENV === 'development'); if (DEVMODE) { console.log('application started in development mode on port ${PORT}');
}
NODE_DEBUG
cho phép gỡ lỗi tin nhắn bằng Node.js util.debuglog
(xem bên dưới), nhưng cũng tham khảo tài liệu về các mô-đun và khung chính của bạn để khám phá các tùy chọn khác.
Lưu ý rằng các biến môi trường cũng có thể được lưu vào một .env
tập tin. Ví dụ:
NODE_ENV=development
NODE_LOG=./log/debug.log
SERVER_PORT=3000
DB_HOST=localhost
DB_NAME=mydatabase
Sau đó được tải bằng cách sử dụng dotenv
mô-đun:
require('dotenv').config();
Gỡ lỗi Node.js: Tùy chọn dòng lệnh
Thông báo sau tùy chọn dòng lệnh có thể được truyền cho node
thời gian chạy khi khởi chạy một ứng dụng. Một trong những điều hữu ích nhất là --trace-warnings
, trong đó đưa ra dấu vết ngăn xếp cho các cảnh báo quá trình (bao gồm cả khấu hao).
Bất kỳ số lượng tùy chọn có thể được đặt, bao gồm:
--enable-source-maps
: bật bản đồ nguồn (thử nghiệm)--throw-deprecation
: lỗi ném khi sử dụng các tính năng không dùng nữa--inspect
: kích hoạt trình kiểm tra V8 (xem bên dưới)
Bằng một ví dụ, hãy thử đăng nhập mô-đun mật mã DEFAULT_ENCODING
tài sản, không được dùng trong Node v10:
const crypto = require('crypto'); function bar() { console.log(crypto.DEFAULT_ENCODING);
} function foo(){ bar();
} foo();
Bây giờ chạy cái này với cái sau:
node index.js
Sau đó chúng ta sẽ thấy điều này:
buffer
(node:7405) [DEP0091] DeprecationWarning: crypto.DEFAULT_ENCODING is deprecated.
Tuy nhiên, chúng ta cũng có thể làm điều này:
node --trace-warnings index.js
Điều đó tạo ra như sau:
buffer
(node:7502) [DEP0091] DeprecationWarning: crypto.DEFAULT_ENCODING is deprecated. at bar (/home/Desktop/index.js:4:22) at foo (/home/Desktop/index.js:8:3) at Object.<anonymous> (/home/Desktop/index.js:11:1) at Module._compile (internal/modules/cjs/loader.js:1151:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1171:10) at Module.load (internal/modules/cjs/loader.js:1000:32) at Function.Module._load (internal/modules/cjs/loader.js:899:14) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12) at internal/main/run_main_module.js:17:47
Điều này cho chúng ta biết rằng cảnh báo khấu hao xuất phát từ mã trong dòng 4 ( console.log
câu lệnh), được thực thi khi bar
chức năng chạy. Các bar
chức năng được gọi bởi foo
chức năng trên dòng 8 và foo
Hàm được gọi trên dòng 11 của tập lệnh của chúng tôi.
Lưu ý rằng các tùy chọn tương tự cũng có thể được chuyển đến gật đầu.
Bảng điều khiển gỡ lỗi
Một trong những cách dễ nhất để gỡ lỗi ứng dụng là xuất giá trị ra bàn điều khiển trong khi thực thi:
console.log( myVariable );
Rất ít nhà phát triển đào sâu ngoài lệnh gỡ lỗi khiêm tốn này, nhưng họ đang bỏ lỡ nhiều khả năng hơn, bao gồm những điều này:
console.log()
chấp nhận danh sách các giá trị được phân tách bằng dấu phẩy. Ví dụ:
let x = 123;
console.log('x:', x);
// x: 123
Tuy vậy, Phá hủy ES6 có thể cung cấp đầu ra tương tự với nỗ lực gõ ít hơn:
console.log({x});
// { x: 123 }
Các đối tượng lớn hơn có thể được xuất ra dưới dạng một chuỗi cô đọng bằng cách sử dụng:
console.log( JSON.stringify(obj) );
util.inspect
sẽ định dạng các đối tượng để đọc dễ dàng hơn, nhưng console.dir()
làm công việc khó khăn cho bạn.
Node.js util.debuglog
Node.js util
mô-đun cung cấp tích hợp debuglog
phương pháp có điều kiện viết tin nhắn vào STDERR
:
const util = require('util');
const debuglog = util.debuglog('myapp'); debuglog('myapp debug message [%d]', 123);
Khi NODE_DEBUG
biến môi trường được đặt thành myapp
(hoặc ký tự đại diện như *
or my*
), tin nhắn được hiển thị trong bảng điều khiển:
NODE_DEBUG=myapp node index.js
MYAPP 9876: myapp debug message [123]
Ở đây, 9876
là ID tiến trình Node.js.
Theo mặc định, util.debuglog
là im lặng. Nếu bạn đã chạy tập lệnh trên mà không đặt NODE_DEBUG
biến, không có gì sẽ được xuất ra giao diện điều khiển. Điều này cho phép bạn để lại ghi nhật ký gỡ lỗi hữu ích trong mã của bạn mà không làm lộn xộn bảng điều khiển để sử dụng thường xuyên.
Gỡ lỗi với các mô-đun đăng nhập
Các mô-đun ghi nhật ký của bên thứ ba có sẵn nếu bạn yêu cầu các tùy chọn tinh vi hơn về mức độ nhắn tin, mức độ chi tiết, sắp xếp, đầu ra tệp, hồ sơ, v.v. Các tùy chọn phổ biến bao gồm:
Thanh tra V8 Node.js
Trong các phần sau, dự án pagehit phát triển trong hướng dẫn khác được sử dụng để minh họa các khái niệm gỡ lỗi. Bạn có thể tải xuống với:
git clone https://github.com/sitepoint-editors/pagehit-ram
Hoặc bạn có thể sử dụng bất kỳ mã nào của riêng bạn.
Node.js là một trình bao bọc xung quanh công cụ JavaScript V8 bao gồm công cụ riêng của nó thanh tra và gỡ lỗi khách hàng. Để bắt đầu, sử dụng inspect
đối số (không được nhầm lẫn với --inspect
) để bắt đầu một ứng dụng:
node inspect ./index.js
Trình gỡ lỗi sẽ tạm dừng ở dòng đầu tiên và hiển thị debug>
lời nhắc:
< Debugger listening on ws://127.0.0.1:9229/6f38abc1-8568-4035-a5d2-dee6cbbf7e44
< For help, see: https://nodejs.org/en/docs/inspector
< Debugger attached.
Break on start in index.js:7 5 const 6 // default HTTP port
> 7 port = 3000, 8 9 // Node.js modules
debug>
Bạn có thể bước qua ứng dụng bằng cách nhập:
cont
orc
: tiếp tục thực hiệnnext
orn
: chạy lệnh tiếp theostep
ors
: bước vào một chức năng được gọiout
oro
: bước ra khỏi hàm và quay lại lệnh gọipause
: tạm dừng mã đang chạy
Các tùy chọn khác bao gồm:
- xem các giá trị biến với
watch('myvar')
- thiết lập các điểm dừng với
setBreakpoint()
/sb()
lệnh (thường dễ dàng hơn để chèn mộtdebugger;
tuyên bố trong mã của bạn) restart
một kịch bản.exit
trình gỡ lỗi (ban đầu.
bắt buộc)
Nếu điều này nghe có vẻ khủng khiếp, nó là. Chỉ sử dụng ứng dụng gỡ lỗi tích hợp khi hoàn toàn không có tùy chọn nào khác, bạn cảm thấy đặc biệt là bạo dâm và bạn không sử dụng Windows (thường có vấn đề).
Gỡ lỗi Node.js với Chrome
Trình kiểm tra Node.js (không có trình gỡ lỗi máy khách) được bắt đầu với --inspect
cờ:
node --inspect ./index.js
Lưu ý: nodemon
có thể được sử dụng thay vì node
Nếu cần.
Điều này bắt đầu trình gỡ lỗi lắng nghe 127.0.0.1:9229
, mà bất kỳ máy khách gỡ lỗi cục bộ nào cũng có thể đính kèm vào:
Debugger listening on ws://127.0.0.1:9229/20ac75ae-90c5-4db6-af6b-d9d74592572f
Nếu bạn đang chạy ứng dụng Node.js trên một thiết bị hoặc bộ chứa Docker khác, hãy đảm bảo cổng 9229
có thể truy cập và cấp quyền truy cập từ xa bằng cách này:
node --inspect=0.0.0.0:9229 ./index.js
Ngoài ra, bạn có thể sử dụng --inspect-brk
để đặt điểm dừng trên câu lệnh đầu tiên để ứng dụng bị tạm dừng ngay lập tức.
Mở Chrome và nhập chrome://inspect
trong thanh địa chỉ.
Lưu ý: nếu ứng dụng Node.js không xuất hiện dưới dạng Mục tiêu từ xa, đảm bảo Khám phá các mục tiêu mạng được kiểm tra, sau đó nhấp Thiết lập để thêm địa chỉ IP và cổng của thiết bị nơi ứng dụng đang chạy.
Nhấp vào mục tiêu thanh tra liên kết để khởi chạy DevTools. Nó sẽ ngay lập tức quen thuộc với bất cứ ai có kinh nghiệm gỡ lỗi trình duyệt.
Sản phẩm + Thêm thư mục vào không gian làm việc liên kết cho phép bạn chọn vị trí các tệp Node.js trên hệ thống của mình, do đó việc tải các mô-đun khác và thực hiện các thay đổi sẽ trở nên dễ dàng hơn.
Nhấp vào bất kỳ số dòng nào sẽ đặt điểm dừng, được biểu thị bằng điểm đánh dấu màu xanh lục, dừng thực thi khi đạt được mã đó:
Các biến có thể được thêm vào Đồng hồ đeo tay khung bên phải bằng cách nhấp vào + biểu tượng và nhập tên của họ. Giá trị của chúng được hiển thị bất cứ khi nào việc thực thi bị tạm dừng.
Sản phẩm Cuộc gọi ngăn xếp khung hiển thị các chức năng đã được gọi để đạt đến điểm này.
Sản phẩm Phạm vi khung hiển thị trạng thái của tất cả các biến cục bộ và toàn cầu có sẵn.
Sản phẩm Điểm dừng khung hiển thị danh sách tất cả các điểm dừng và cho phép chúng được bật hoặc tắt.
Các biểu tượng trên Trình gỡ lỗi tạm dừng tin nhắn có thể được sử dụng để tiếp tục thực hiện, bước qua, bước vào, bước ra, bước qua, hủy kích hoạt tất cả các điểm dừng và tạm dừng trên các ngoại lệ.
Gỡ lỗi Node.js với Mã VS
Gỡ lỗi VS Code Node.js có thể được khởi chạy mà không cần bất kỳ cấu hình nào khi bạn đang chạy ứng dụng Node.js trên hệ thống cục bộ của mình. Mở tệp bắt đầu (thường là index.js
), kích hoạt Chạy và gỡ lỗi và bấm vào ô Chạy và gỡ lỗi Node.js (F5) .
Màn hình gỡ lỗi tương tự như DevTools của Chrome với Biến, Đồng hồ đeo tay, Cuộc gọi ngăn xếp, Tập lệnh đã tảivà Điểm dừng danh sách.
Một điểm dừng có thể được đặt bằng cách nhấp vào máng xối bên cạnh số dòng. Bạn cũng có thể nhấp chuột phải.
Với nhấp chuột phải này, bạn có thể đặt như sau:
-
Một điểm dừng tiêu chuẩn.
-
Một điểm dừng có điều kiện dừng khi các tiêu chí được đáp ứng - ví dụ:
count > 3
. -
Một logpoint, có hiệu quả
console.log()
không có mã! Bất kỳ chuỗi nào cũng có thể được nhập với các biểu thức được biểu thị trong dấu ngoặc nhọn - ví dụ:{count}
để hiển thị giá trị củacount
biến.
Lưu ý: đừng quên đánh Trả hàng cho Mã VS để tạo điểm dừng hoặc điểm log có điều kiện của bạn.
Thanh biểu tượng gỡ lỗi ở trên cùng có thể được sử dụng để tiếp tục thực hiện, bước qua, bước vào, bước ra, khởi động lại hoặc dừng ứng dụng và gỡ lỗi. Tùy chọn giống hệt cũng có sẵn từ Gỡ lỗi mục trong menu.
Để biết thêm thông tin, tham khảo Gỡ lỗi trong Visual Studio Code.
Cấu hình gỡ lỗi nâng cao
Cần thêm cấu hình khi bạn gỡ lỗi một dịch vụ từ xa hoặc cần sử dụng các tùy chọn khởi chạy khác nhau. Cửa hàng VS Code khởi chạy cấu hình trong một launch.json
tập tin được tạo bên trong .vscode
thư mục trong dự án của bạn. Để tạo hoặc chỉnh sửa tệp, nhấp vào biểu tượng răng cưa ở trên cùng bên phải của Chạy và gỡ lỗi cửa sổ.
Bất kỳ số lượng cài đặt cấu hình có thể được thêm vào configurations
mảng. Nhấn vào Thêm cấu hình nút để chọn một tùy chọn. Mã VS có thể:
- phóng một quá trình sử dụng chính Node.js hoặc
- đính kèm đến quy trình kiểm tra Node.js, có thể chạy trên máy từ xa hoặc bộ chứa Docker
Trong ví dụ trên, một cấu hình khởi chạy Nodemon duy nhất đã được xác định. Tiết kiệm launch.json
, lựa chọn nodemon
từ danh sách thả xuống ở đầu Chạy và gỡ lỗi khung và nhấp vào biểu tượng bắt đầu màu xanh lá cây.
Để biết thêm thông tin, xem Cấu hình khởi chạy mã VS.
Sản phẩm Hướng dẫn gỡ lỗi Node.js cung cấp lời khuyên cho các IDE và trình soạn thảo khác bao gồm Visual Studio, JetBrains, WebStorm, Gitpod và Eclipse. Nguyên tử cũng có một gỡ lỗi nút gia hạn.
ndb cung cấp một cải thiện trải nghiệm gỡ lỗi với các tính năng mạnh mẽ như gắn vào các tiến trình con và hộp đen tập lệnh để chỉ mã trong các thư mục cụ thể được hiển thị.
Sản phẩm Bộ công cụ báo cáo của IBM cho Node.js hoạt động bằng cách phân tích dữ liệu đầu ra khi node
được chạy với --experimental-report
tùy chọn.
Cuối cùng, các dịch vụ thương mại như Đăng NhậpTên Lửa và Sentry.io tích hợp với ứng dụng web trực tiếp của bạn trong cả máy khách và máy chủ để ghi lại các lỗi mà người dùng gặp phải.
Nhận gỡ lỗi!
Node.js có một loạt các công cụ gỡ lỗi và phân tích mã tuyệt vời có thể cải thiện tốc độ và độ tin cậy của ứng dụng của bạn. Dù họ có thể cám dỗ bạn hay không console.log()
là một vấn đề khác!
Nguồn: https://www.sitepoint.com/debug-node-app-tips-tricks-tools/?utm_source=rss