Logo Zephyrnet

Cách gỡ lỗi ứng dụng Node.js: Mẹo, thủ thuật và công cụ

Ngày:

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ử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áoMã 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ã VSkẻ nói dối cho nguyên tử Kiểm tra mã của bạn khi bạn nhập:

Tiếng Anh cho mã VS

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ư GitHubCai 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 or c: tiếp tục thực hiện
  • next or n: chạy lệnh tiếp theo
  • step or s: bước vào một chức năng được gọi
  • out or o: bước ra khỏi hàm và quay lại lệnh gọi
  • pause: 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ột debugger; 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ỉ.

Chrome kiểm tra

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.

Công cụ dành cho nhà phát triển của Chrome

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ã đó:

Điểm dừng của DevTools Chrome

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) .

Trình gỡ lỗi mã VS

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ảiĐiểm dừng danh sách.

Điểm dừng mã VS

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.

Tùy chọn điểm dừng mã VS

Với nhấp chuột phải này, bạn có thể đặt như sau:

  1. Một điểm dừng tiêu chuẩn.

  2. 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.

  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ủa count biến.

    Mã điểm VS

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ổ.

Cấu hình khởi chạy mã VS

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ể:

  1. phóng một quá trình sử dụng chính Node.js hoặc
  2. đí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.

Ra mắt mã VS

Để 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ửaSentry.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

tại chỗ_img

Tin tức mới nhất

tại chỗ_img