Thứ tư, 24/06/2020 | 00:00 GMT+7

Cách gỡ lỗi Node.js bằng Trình gỡ lỗi tích hợp và Công cụ dành cho nhà phát triển của Chrome

Trong quá trình phát triển Node.js, việc truy tìm lỗi mã hóa trở lại nguồn của nó có thể tiết kiệm rất nhiều thời gian trong suốt quá trình của một dự án. Nhưng khi một chương trình ngày càng phức tạp, càng ngày càng khó để thực hiện việc này một cách hiệu quả. Để giải quyết vấn đề này, các nhà phát triển sử dụng các công cụ như trình gỡ lỗi , một chương trình cho phép các nhà phát triển kiểm tra chương trình của họ khi nó chạy. Bằng cách phát lại từng dòng mã và quan sát cách nó thay đổi trạng thái của chương trình, trình gỡ lỗi có thể cung cấp thông tin chi tiết về cách chương trình đang chạy, giúp tìm lỗi dễ dàng hơn.

Một thực tế phổ biến mà các lập trình viên sử dụng để theo dõi lỗi trong mã của họ là in các câu lệnh khi chương trình chạy. Trong Node.js, điều đó liên quan đến việc thêm các câu lệnh bổ sung console.log() hoặc console.debug() trong các module của chúng. Mặc dù kỹ thuật này được dùng nhanh chóng, nhưng nó cũng là thủ công, làm cho nó ít khả năng mở rộng và dễ bị lỗi hơn. Sử dụng phương pháp này, có thể ghi nhầm thông tin nhạy cảm vào console , điều này có thể cung cấp cho tác nhân độc hại thông tin cá nhân về khách hàng hoặc ứng dụng của bạn. Mặt khác, trình gỡ lỗi cung cấp một cách có hệ thống để quan sát những gì đang xảy ra trong một chương trình mà không khiến chương trình của bạn gặp phải các mối đe dọa bảo mật.

Các tính năng chính của trình gỡ lỗi là xem các đối tượng và thêm các điểm ngắt . Bằng cách xem các đối tượng, trình gỡ lỗi có thể giúp theo dõi các thay đổi của một biến khi người lập trình bước qua một chương trình. Điểm ngắt là các điểm đánh dấu mà lập trình viên có thể đặt vào mã của họ để ngăn mã tiếp tục vượt quá các điểm mà nhà phát triển đang điều tra.

Trong bài viết này, bạn sẽ sử dụng trình gỡ lỗi để gỡ lỗi một số ứng dụng Node.js mẫu. Trước tiên, bạn sẽ gỡ lỗi mã bằng công cụ gỡ lỗi Node.js được tích hợp sẵn, cài đặt các trình theo dõi và điểm ngắt để bạn có thể tìm ra nguyên nhân root rễ của lỗi. Sau đó, bạn sẽ sử dụng Google Chrome DevTools làm Giao diện user đồ họa (GUI) thay thế cho trình gỡ lỗi dòng lệnh Node.js.

Yêu cầu

Bước 1 - Sử dụng Watchers với Trình gỡ lỗi Node.js

Trình gỡ lỗi chủ yếu hữu ích cho hai tính năng: khả năng xem các biến và quan sát cách chúng thay đổi khi chương trình được chạy và khả năng dừng và bắt đầu thực thi mã tại các vị trí khác nhau được gọi là điểm ngắt . Trong bước này, ta sẽ chạy qua cách xem các biến để xác định lỗi trong mã.

Việc xem các biến khi ta thực hiện từng bước mã sẽ cho ta cái nhìn sâu sắc về cách các giá trị của các biến thay đổi khi chương trình chạy. Hãy thực hành xem các biến để giúp ta tìm và sửa lỗi logic trong mã của ta với một ví dụ.

Ta bắt đầu bằng cách cài đặt môi trường mã hóa của bạn . Trong terminal của bạn, hãy tạo một folder mới có tên là debugging :

  • mkdir debugging

Bây giờ hãy nhập folder đó:

  • cd debugging

Mở một file mới có tên là badLoop.js . Ta sẽ sử dụng nano vì nó có sẵn trong terminal :

  • nano badLoop.js

Mã của ta sẽ lặp lại trên một mảng và thêm các số thành một tổng tổng, trong ví dụ của ta sẽ được sử dụng để cộng số lượng đơn đặt hàng hàng ngày trong suốt một tuần tại một cửa hàng. Chương trình sẽ trả về tổng của tất cả các số trong mảng. Trong editor , hãy nhập mã sau:

debugging / badLoop.js
let orders = [341, 454, 198, 264, 307];  let totalOrders = 0;  for (let i = 0; i <= orders.length; i++) {   totalOrders += orders[i]; }  console.log(totalOrders); 

Ta bắt đầu bằng cách tạo mảng orders , lưu trữ năm số. Sau đó, ta khởi tạo totalOrders thành 0 , vì nó sẽ lưu trữ tổng của năm số. Trongvòng lặp for , ta cộng từng giá trị theo orders vào totalOrders . Cuối cùng, ta in tổng số tiền đặt hàng khi kết thúc chương trình.

Lưu và thoát khỏi editor . Bây giờ hãy chạy chương trình này với node :

  • node badLoop.js

Thiết bị terminal sẽ hiển thị kết quả này:

Output
NaN

NaN trong JavaScript nghĩa là Không phải số . Cho rằng tất cả đầu vào là số hợp lệ, đây là hành vi không mong muốn. Để tìm lỗi, hãy sử dụng trình gỡ lỗi Node.js để xem điều gì xảy ra với hai biến được thay đổi trong vòng lặp for : totalOrdersi .

Khi ta muốn sử dụng trình gỡ lỗi Node.js tích hợp sẵn trên một chương trình, ta bao gồm inspect trước tên file . Trong terminal của bạn, hãy chạy lệnh node với tùy chọn trình gỡ lỗi này như sau:

  • node inspect badLoop.js

Khi bạn khởi động trình gỡ lỗi, bạn sẽ tìm thấy kết quả như sau:

Output
< Debugger listening on ws://127.0.0.1:9229/e1ebba25-04b8-410b-811e-8a0c0902717a < For help, see: https://nodejs.org/en/docs/inspector < Debugger attached. Break on start in badLoop.js:1 > 1 let orders = [341, 454, 198, 264, 307]; 2 3 let totalOrders = 0;

Dòng đầu tiên hiển thị cho ta URL của server gỡ lỗi của ta . Điều đó được sử dụng khi ta muốn gỡ lỗi với các ứng dụng bên ngoài, chẳng hạn như trình duyệt web như ta sẽ thấy ở phần sau. Lưu ý server này lắng nghe trên cổng :9229 của localhost ( 127.0.0.1 ) theo mặc định. Vì lý do bảo mật, bạn nên tránh để lộ cổng này ra công chúng.

Sau khi trình gỡ lỗi được đính kèm, trình gỡ lỗi xuất ra Break on start in badLoop.js:1 .

Điểm ngắt là những vị trí trong mã của ta , nơi ta muốn dừng việc thực thi. Theo mặc định, trình gỡ lỗi của Node.js ngừng thực thi ở phần đầu của file .

Sau đó, trình gỡ lỗi hiển thị cho ta một đoạn mã, theo sau là dấu nhắc debug đặc biệt:

Output
... > 1 let orders = [341, 454, 198, 264, 307]; 2 3 let totalOrders = 0; debug>

Dấu > bên cạnh 1 cho biết ta đã đạt đến dòng nào trong quá trình thực thi và dấu nhắc là nơi ta sẽ nhập lời khen cho trình gỡ lỗi. Khi kết quả này xuất hiện, trình gỡ lỗi đã sẵn sàng chấp nhận các lệnh.

Khi sử dụng trình gỡ lỗi, ta từng bước qua mã bằng cách yêu cầu trình gỡ lỗi chuyển sang dòng tiếp theo mà chương trình sẽ thực thi. Node.js cho phép các lệnh sau sử dụng trình gỡ lỗi:

  • c hoặc cont : Tiếp tục thực hiện đến điểm ngắt tiếp theo hoặc đến cuối chương trình.
  • n hoặc next : Di chuyển đến dòng mã tiếp theo.
  • s hoặc step : Bước vào một chức năng. Theo mặc định, ta chỉ bước qua mã trong khối hoặc phạm vi mà ta đang gỡ lỗi. Bằng cách bước vào một hàm, ta có thể kiểm tra mã của hàm mà mã của ta gọi và quan sát cách nó phản ứng với dữ liệu của ta .
  • o : Bước ra khỏi một chức năng. Sau khi bước vào một hàm, trình gỡ lỗi sẽ quay trở lại file chính khi hàm trả về. Ta có thể sử dụng lệnh này để quay lại hàm ban đầu mà ta đã gỡ lỗi trước khi hàm hoàn tất thực thi.
  • pause : Tạm dừng mã đang chạy.

Ta sẽ xem xét từng dòng mã này. Nhấn phím n để chuyển sang dòng tiếp theo:

  • n

Trình gỡ lỗi của ta bây giờ sẽ bị kẹt trên dòng mã thứ ba:

Output
break in badLoop.js:3 1 let orders = [341, 454, 198, 264, 307]; 2 > 3 let totalOrders = 0; 4 5 for (let i = 0; i <= orders.length; i++) {

Các dòng trống được bỏ qua để thuận tiện. Nếu ta nhấn n trong console gỡ lỗi, trình gỡ lỗi của ta sẽ nằm trên dòng mã thứ năm:

Output
break in badLoop.js:5 3 let totalOrders = 0; 4 > 5 for (let i = 0; i <= orders.length; i++) { 6 totalOrders += orders[i]; 7 }

Bây giờ ta đang bắt đầu vòng lặp của ta . Nếu terminal hỗ trợ màu, số 0 trong let i = 0 sẽ được tô sáng. Trình gỡ lỗi đánh dấu phần mã mà chương trình sắp thực thi và trong vòng lặp for , quá trình khởi tạo bộ đếm được thực hiện trước. Từ đây, ta có thể xem tại sao totalOrders trả về NaN thay vì một số. Trong vòng lặp này, hai biến được thay đổi mỗi lần lặp - totalOrdersi . Hãy cài đặt trình theo dõi cho cả hai biến đó.

Đầu tiên, ta sẽ thêm một người theo dõi cho biến totalOrders . Trong shell tương tác, hãy nhập vào:

  • watch('totalOrders')

Để xem một biến, ta sử dụng hàm watch() tích hợp sẵn với đối số là chuỗi chứa tên biến. Khi ta nhấn ENTER trên hàm watch() , dấu nhắc sẽ chuyển sang dòng tiếp theo mà không cung cấp phản hồi, nhưng từ watch sẽ hiển thị khi ta di chuyển trình gỡ lỗi sang dòng tiếp theo.

Bây giờ, hãy thêm một người theo dõi cho biến i :

  • watch('i')

Bây giờ ta có thể thấy những người theo dõi của ta đang hoạt động. Nhấn n để sang bước tiếp theo. Control panel gỡ lỗi sẽ hiển thị điều này:

Output
break in badLoop.js:5 Watchers: 0: totalOrders = 0 1: i = 0 3 let totalOrders = 0; 4 > 5 for (let i = 0; i <= orders.length; i++) { 6 totalOrders += orders[i]; 7 }

Trình gỡ lỗi hiện hiển thị các giá trị của totalOrdersi trước khi hiển thị dòng mã, như trong kết quả . Các giá trị này được cập nhật mỗi khi một dòng mã thay đổi chúng.

Đến đây, trình gỡ lỗi đang đánh dấu length theo orders.length . Điều này nghĩa là chương trình sắp kiểm tra điều kiện trước khi thực thi mã bên trong khối của nó. Sau khi mã được thực thi, biểu thức cuối cùng i++ sẽ được thực thi. Bạn có thể đọc thêm về vòng lặp for và cách thực thi của chúngtrong hướng dẫnCách tạo vòng lặp for trong JavaScript của ta .

Nhập n vào console để nhập nội dung for vòng lặp for :

Output
break in badLoop.js:6 Watchers: 0: totalOrders = 0 1: i = 0 4 5 for (let i = 0; i <= orders.length; i++) { > 6 totalOrders += orders[i]; 7 } 8

Bước này cập nhật biến totalOrders . Do đó, sau khi bước này hoàn tất, biến và trình theo dõi của ta sẽ được cập nhật.

Nhấn n để xác nhận. Bạn sẽ thấy điều này:

Output
Watchers: 0: totalOrders = 341 1: i = 0 3 let totalOrders = 0; 4 > 5 for (let i = 0; i <= orders.length; i++) { 6 totalOrders += orders[i]; 7 }

Như đã đánh dấu, totalOrders hiện có giá trị của đơn hàng đầu tiên: 341 .

Trình gỡ lỗi của ta chỉ sắp xử lý điều kiện cuối cùng của vòng lặp. Nhập n để ta thực hiện dòng này và cập nhật i :

Output
break in badLoop.js:5 Watchers: 0: totalOrders = 341 1: i = 1 3 let totalOrders = 0; 4 > 5 for (let i = 0; i <= orders.length; i++) { 6 totalOrders += orders[i]; 7 }

Sau khi khởi tạo, ta phải xem qua mã bốn lần để xem các biến được cập nhật. Bước qua mã như thế này có thể tẻ nhạt; vấn đề này sẽ được giải quyết bằng các điểm ngắt trong Bước 2 . Nhưng hiện tại, bằng cách cài đặt những người theo dõi của ta , ta đã sẵn sàng quan sát các giá trị của họ và tìm ra vấn đề của ta .

Bước qua chương trình bằng lệnh n mười hai lần nữa, quan sát kết quả . Control panel của bạn sẽ hiển thị:

Output
break in badLoop.js:5 Watchers: 0: totalOrders = 1564 1: i = 5 3 let totalOrders = 0; 4 > 5 for (let i = 0; i <= orders.length; i++) { 6 totalOrders += orders[i]; 7 }

Nhớ lại rằng mảng orders của ta có năm mặt hàng và hiện tại i đang ở vị trí 5 . Nhưng vì i được sử dụng làm chỉ số của một mảng, nên không có giá trị nào theo thứ orders[5] ; giá trị cuối cùng của mảng orders ở chỉ số 4 . Điều này nghĩa là các orders[5] sẽ có giá trị undefined .

Nhập n vào console và bạn sẽ thấy rằng mã trong vòng lặp được thực thi:

Output
break in badLoop.js:6 Watchers: 0: totalOrders = 1564 1: i = 5 4 5 for (let i = 0; i <= orders.length; i++) { > 6 totalOrders += orders[i]; 7 } 8

Nhập n sẽ hiển thị giá trị của totalOrders sau lần lặp đó:

Output
break in badLoop.js:5 Watchers: 0: totalOrders = NaN 1: i = 5 3 let totalOrders = 0; 4 > 5 for (let i = 0; i <= orders.length; i++) { 6 totalOrders += orders[i]; 7 }

Thông qua gỡ lỗi và xem totalOrdersi , ta có thể thấy rằng vòng lặp của ta đang lặp lại sáu lần thay vì năm lần. Khi i 5 , orders[5] được thêm vào totalOrders . Vì orders[5]undefined , việc thêm số này vào một số sẽ mang lại NaN . Do đó, vấn đề với mã của ta nằm trong điều kiện của vòng lặp for của ta . Thay vì kiểm tra xem i có nhỏ hơn hoặc bằng độ dài của mảng orders , ta chỉ nên kiểm tra xem nó có nhỏ hơn độ dài hay không.

Hãy thoát khỏi trình gỡ lỗi của ta , áp dụng các thay đổi và chạy lại mã. Trong dấu nhắc gỡ lỗi, hãy nhập lệnh thoát và nhấn ENTER :

  • .exit

Đến đây bạn đã thoát khỏi trình gỡ lỗi, hãy mở badLoop.js trong editor của bạn:

  • nano badLoop.js

Thay đổi điều kiện của vòng lặp for :

trình gỡ lỗi / badLoop.js
... for (let i = 0; i < orders.length; i++) { ... 

Lưu và thoát nano . Bây giờ ta hãy thực thi tập lệnh của ta như sau:

  • node badLoop.js

Khi hoàn tất, kết quả chính xác sẽ được in:

Output
1564

Trong phần này, ta đã sử dụng lệnh watch của trình gỡ lỗi để tìm lỗi trong mã của ta , sửa nó và xem nó hoạt động như mong đợi.

Bây giờ ta đã có một số kinh nghiệm về cách sử dụng cơ bản của trình gỡ lỗi để xem các biến, hãy xem cách ta có thể sử dụng các điểm ngắt để ta có thể gỡ lỗi mà không cần xem qua tất cả các dòng mã từ đầu chương trình.

Bước 2 - Sử dụng Breakpoints với trình gỡ lỗi Node.js

Thông thường các dự án Node.js bao gồm nhiều mô-đun được kết nối với nhau. Gỡ lỗi từng dòng module sẽ tốn thời gian, đặc biệt là khi một ứng dụng có quy mô phức tạp. Để giải quyết vấn đề này, các điểm ngắt cho phép ta chuyển đến một dòng mã mà ta muốn tạm dừng thực thi và kiểm tra chương trình.

Khi gỡ lỗi trong Node.js, ta thêm một điểm ngắt bằng cách thêm trực tiếp từ khóa debugger vào mã của ta . Sau đó, ta có thể đi từ điểm ngắt này sang điểm ngắt tiếp theo bằng cách nhấn c trong console trình gỡ lỗi thay vì nhấn n . Tại mỗi điểm ngắt, ta có thể cài đặt các bộ theo dõi cho các biểu hiện quan tâm.

Hãy xem điều này với một ví dụ. Trong bước này, ta sẽ cài đặt một chương trình đọc danh sách các câu và xác định từ phổ biến nhất được sử dụng trong toàn bộ văn bản. Mã mẫu của ta sẽ trả về từ đầu tiên có số lần xuất hiện cao nhất.

Đối với bài tập này, ta sẽ tạo ba file . Tệp đầu tiên, sentences.txt , sẽ chứa dữ liệu thô mà chương trình của ta sẽ xử lý. Ta sẽ thêm văn bản bắt đầu từ bài báo của Encyclopaedia Britannica về Cá mập voi làm dữ liệu mẫu, với dấu chấm câu bị xóa.

Mở file trong editor của bạn:

  • nano sentences.txt

Tiếp theo, nhập mã sau:

trình gỡ lỗi / câu.txt
Whale shark Rhincodon typus gigantic but harmless shark family Rhincodontidae that is the largest living fish Whale sharks are found in marine environments worldwide but mainly in tropical oceans They make up the only species of the genus Rhincodon and are classified within the order Orectolobiformes a group containing the carpet sharks The whale shark is enormous and reportedly capable of reaching a maximum length of about 18 metres 59 feet Most specimens that have been studied however weighed about 15 tons about 14 metric tons and averaged about 12 metres 39 feet in length The body coloration is distinctive Light vertical and horizontal stripes form a checkerboard pattern on a dark background and light spots mark the fins and dark areas of the body 

Lưu và thoát khỏi file .

Bây giờ hãy thêm mã của ta vào textHelper.js . Mô-đun này sẽ chứa một số chức năng tiện dụng mà ta sẽ sử dụng để xử lý file văn bản, giúp dễ dàng xác định từ phổ biến nhất. Mở textHelper.js trong editor của bạn:

  • nano textHelper.js

Ta sẽ tạo ba hàm để xử lý dữ liệu trong sentences.txt . Đầu tiên sẽ là đọc file . textHelper.js sau vào textHelper.js :

debugger / textHelper.js
const fs = require('fs');  const readFile = () => {   let data = fs.readFileSync('sentences.txt');   let sentences = data.toString();   return sentences; }; 

Đầu tiên, ta nhập thư viện fs Node.js để ta có thể đọc file . Sau đó, ta tạo hàm readFile() sử dụng readFileSync() để tải dữ liệu từ sentences.txt dưới dạng đối tượng Buffer và phương thức toString() để trả về dưới dạng một chuỗi.

Hàm tiếp theo, ta sẽ thêm xử lý một chuỗi văn bản và làm phẳng nó thành một mảng với các từ của nó. Thêm mã sau vào editor :

textHelper.js
...  const getWords = (text) => {   let allSentences = text.split('\n');   let flatSentence = allSentences.join(' ');   let words = flatSentence.split(' ');   words = words.map((word) => word.trim().toLowerCase());   return words; }; 

Trong đoạn mã này, ta đang sử dụng các phương thức split() , join()map() để thao tác chuỗi thành một mảng các từ riêng lẻ. Hàm cũng viết thường mỗi từ để giúp đếm dễ dàng hơn.

Hàm cuối cùng cần thiết trả về số lượng các từ khác nhau trong một mảng chuỗi. Thêm chức năng cuối cùng như thế này:

debugger / textHelper.js
...  const countWords = (words) => {   let map = {};   words.forEach((word) => {     if (word in map) {       map[word] = 1;     } else {       map[word] += 1;     }   });    return map; }; 

Ở đây, ta tạo một đối tượng JavaScript được gọi là map có các từ làm khóa của nó và số lượng của chúng là giá trị. Ta lặp qua mảng, thêm một vào số mỗi từ khi đó là phần tử hiện tại của vòng lặp. Hãy hoàn thành module này bằng cách xuất các chức năng này, cung cấp chúng cho các module khác:

debugger / textHelper.js
...  module.exports = { readFile, getWords, countWords }; 

Lưu và thoát.

Tệp thứ ba và cuối cùng mà ta sẽ sử dụng cho bài tập này sẽ sử dụng module textHelper.js để tìm từ phổ biến nhất trong văn bản của ta . Mở index.js bằng editor của bạn:

  • nano index.js

Ta bắt đầu mã của bạn bằng lệnh module textHelpers.js :

debugger / index.js
const textHelper = require('./textHelper'); 

Tiếp tục bằng cách tạo một mảng mới chứa các từ dừng :

debugger / index.js
...  const stopwords = ['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself', 'she', 'her', 'hers', 'herself', 'it', 'its', 'itself', 'they', 'them', 'their', 'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this', 'that', 'these', 'those', 'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'having', 'do', 'does', 'did', 'doing', 'a', 'an', 'the', 'and', 'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', 'at', 'by', 'for', 'with', 'about', 'against', 'between', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 's', 't', 'can', 'will', 'just', 'don', 'should', 'now', '']; 

Từ dừng là những từ thường được sử dụng trong một ngôn ngữ mà ta lọc ra trước khi xử lý văn bản. Ta có thể sử dụng để tìm kiếm dữ liệu có ý nghĩa hơn so với kết quả là từ phổ biến nhất trong văn bản tiếng Anh là the hoặc a .

Tiếp tục bằng cách sử dụng các textHelper.js module textHelper.js để lấy một đối tượng JavaScript với các từ và số lượng của chúng:

debugger / index.js
...  let sentences = textHelper.readFile(); let words = textHelper.getWords(sentences); let wordCounts = textHelper.countWords(words); 

Sau đó, ta có thể hoàn thành module này bằng cách xác định các từ có tần suất cao nhất. Để làm điều này, ta sẽ lặp qua từng khóa của đối tượng với số lượng từ và so sánh số lượng của nó với số lượng tối đa được lưu trữ trước đó. Nếu số từ cao hơn, nó sẽ trở thành số tối đa mới.

Thêm các dòng mã sau để tính từ phổ biến nhất:

debugger / index.js
...  let max = -Infinity; let mostPopular = '';  Object.entries(wordCounts).forEach(([word, count]) => {   if (stopwords.indexOf(word) === -1) {     if (count > max) {       max = count;       mostPopular = word;     }   } });  console.log(`The most popular word in the text is "${mostPopular}" with ${max} occurrences`); 

Trong đoạn mã này, ta đang sử dụng Object.entries() để chuyển đổi các cặp key-value trong đối tượng wordCounts thành các mảng riêng lẻ, tất cả đều được lồng trong một mảng lớn hơn. Sau đó, ta sử dụng phương thức forEach() và một số câu lệnh điều kiện để kiểm tra số lượng của mỗi từ và lưu trữ số cao nhất.

Lưu và thoát khỏi file .

Bây giờ ta hãy chạy file này để xem nó hoạt động. Trong terminal của bạn, hãy nhập lệnh này:

  • node index.js

Bạn sẽ thấy kết quả sau:

Output
The most popular word in the text is "whale" with 1 occurrences

Từ việc đọc văn bản, ta có thể thấy rằng câu trả lời là không chính xác. Tìm kiếm nhanh trong sentences.txt sẽ làm nổi bật rằng từ whale xuất hiện nhiều lần.

Ta có một số hàm có thể gây ra lỗi này: Ta có thể không đọc toàn bộ file hoặc ta có thể không xử lý văn bản thành mảng và đối tượng JavaScript một cách chính xác. Thuật toán của ta để tìm từ tối đa cũng có thể không chính xác. Cách tốt nhất để tìm ra điều gì sai là sử dụng trình gỡ lỗi.

Ngay cả khi không có cơ sở mã lớn, ta không muốn mất thời gian lướt qua từng dòng mã để quan sát khi mọi thứ thay đổi. Thay vào đó, ta có thể sử dụng các điểm ngắt để đi đến những thời điểm quan trọng đó trước khi hàm trả về và quan sát kết quả .

Hãy thêm các điểm ngắt trong mỗi hàm trong module textHelper.js . Để làm như vậy, ta cần thêm debugger từ khóa vào mã của bạn .

Mở file textHelper.js trong editor . Ta sẽ sử dụng nano :

  • nano textHelper.js

Đầu tiên, ta sẽ thêm điểm ngắt vào hàm readFile() như sau:

debugger / textHelper.js
...  const readFile = () => {   let data = fs.readFileSync('sentences.txt');   let sentences = data.toString();   debugger;   return sentences; };  ... 

Tiếp theo, ta sẽ thêm một điểm ngắt khác vào hàm getWords() :

debugger / textHelper.js
...  const getWords = (text) => {   let allSentences = text.split('\n');   let flatSentence = allSentences.join(' ');   let words = flatSentence.split(' ');   words = words.map((word) => word.trim().toLowerCase());   debugger;   return words; };  ... 

Cuối cùng, ta sẽ thêm một điểm ngắt vào hàm countWords() :

debugger / textHelper.js
...  const countWords = (words) => {   let map = {};   words.forEach((word) => {     if (word in map) {       map[word] = 1;     } else {       map[word] += 1;     }   });    debugger;   return map; };  ... 

Lưu và thoát khỏi textHelper.js .

Hãy bắt đầu quá trình gỡ lỗi. Mặc dù các điểm ngắt nằm trong textHelpers.js , ta đang gỡ lỗi điểm nhập chính của ứng dụng của ta : index.js . Bắt đầu phiên gỡ lỗi bằng lệnh lệnh sau vào shell của bạn:

  • node inspect index.js

Sau khi nhập lệnh, ta sẽ được chào đón với kết quả này:

Output
< Debugger listening on ws://127.0.0.1:9229/b2d3ce0e-3a64-4836-bdbf-84b6083d6d30 < For help, see: https://nodejs.org/en/docs/inspector < Debugger attached. Break on start in index.js:1 > 1 const textHelper = require('./textHelper'); 2 3 const stopwords = ['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself', 'she', 'her', 'hers', 'herself', 'it', 'its', 'itself', 'they', 'them', 'their', 'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this', 'that', 'these', 'those', 'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'having', 'do', 'does', 'did', 'doing', 'a', 'an', 'the', 'and', 'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', 'at', 'by', 'for', 'with', 'about', 'against', 'between', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 's', 't', 'can', 'will', 'just', 'don', 'should', 'now', ''];

Lần này, nhập c vào trình gỡ lỗi tương tác. Xin nhắc lại, c là viết tắt của continue. Thao tác này sẽ chuyển trình gỡ lỗi đến điểm ngắt tiếp theo trong mã. Sau khi nhấn c và nhập ENTER , bạn sẽ thấy điều này trong console của bạn :

Output
break in textHelper.js:6 4 let data = fs.readFileSync('sentences.txt'); 5 let sentences = data.toString(); > 6 debugger; 7 return sentences; 8 };

Bây giờ ta đã tiết kiệm được một số thời gian gỡ lỗi bằng cách đi thẳng đến điểm ngắt của ta .

Trong chức năng này, ta muốn đảm bảo tất cả văn bản trong file đang được trả về. Thêm một người theo dõi cho biến sentences để ta có thể xem những gì đang được trả về:

  • watch('sentences')

Nhấn phím n để chuyển sang dòng mã tiếp theo để ta có thể quan sát nội dung trong sentences . Bạn sẽ thấy kết quả sau:

Output
break in textHelper.js:7 Watchers: 0: sentences = 'Whale shark Rhincodon typus gigantic but harmless shark family Rhincodontidae that is the largest living fish\n' + 'Whale sharks are found in marine environments worldwide but mainly in tropical oceans\n' + 'They make up the only species of the genus Rhincodon and are classified within the order Orectolobiformes a group containing the carpet sharks\n' + 'The whale shark is enormous and reportedly capable of reaching a maximum length of about 18 metres 59 feet\n' + 'Most specimens that have been studied however weighed about 15 tons about 14 metric tons and averaged about 12 metres 39 feet in length\n' + 'The body coloration is distinctive\n' + 'Light vertical and horizontal stripes form a checkerboard pattern on a dark background and light spots mark the fins and dark areas of the body\n' 5 let sentences = data.toString(); 6 debugger; > 7 return sentences; 8 }; 9

Có vẻ như ta không gặp sự cố nào khi đọc file ; vấn đề phải nằm ở nơi khác trong mã của ta . Hãy chuyển sang điểm ngắt tiếp theo bằng cách nhấn c . Khi làm như vậy, bạn sẽ thấy kết quả này:

Output
break in textHelper.js:15 Watchers: 0: sentences = ReferenceError: sentences is not defined at eval (eval at getWords (your_file_path/debugger/textHelper.js:15:3), <anonymous>:1:1) at Object.getWords (your_file_path/debugger/textHelper.js:15:3) at Object.<anonymous> (your_file_path/debugger/index.js:7:24) at Module._compile (internal/modules/cjs/loader.js:1125:14) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1167:10) at Module.load (internal/modules/cjs/loader.js:983:32) at Function.Module._load (internal/modules/cjs/loader.js:891:14) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12) at internal/main/run_main_module.js:17:47 13 let words = flatSentence.split(' '); 14 words = words.map((word) => word.trim().toLowerCase()); >15 debugger; 16 return words; 17 };

Ta nhận được thông báo lỗi này vì ta đã cài đặt một trình theo dõi cho biến sentences , nhưng biến đó không tồn tại trong phạm vi hàm hiện tại của ta . Một trình theo dõi kéo dài trong toàn bộ phiên gỡ lỗi, vì vậy, miễn là ta tiếp tục xem các sentences mà nó không được xác định, ta sẽ tiếp tục gặp lỗi này.

Ta có thể ngừng xem các biến bằng lệnh unwatch() . Hãy bỏ bắt các sentences để ta không còn phải thấy thông báo lỗi này mỗi khi trình gỡ lỗi in kết quả của nó. Trong dấu nhắc tương tác, hãy nhập lệnh này:

  • unwatch('sentences')

Trình gỡ lỗi không xuất ra bất kỳ thứ gì khi bạn mở một biến.

Quay lại hàm getWords() , ta muốn chắc chắn rằng ta đang trả về một danh sách các từ được lấy từ văn bản mà ta đã tải trước đó. Hãy xem giá trị của biến words :

  • watch('words')

Sau đó, nhập n để chuyển đến dòng tiếp theo của trình gỡ lỗi, vì vậy ta có thể thấy những gì đang được lưu trữ trong các words . Trình gỡ lỗi sẽ hiển thị như sau:

Output
break in textHelper.js:16 Watchers: 0: words = [ 'whale', 'shark', 'rhincodon', 'typus', 'gigantic', 'but', 'harmless', ... 'metres', '39', 'feet', 'in', 'length', '', 'the', 'body', 'coloration', ... ] 14 words = words.map((word) => word.trim().toLowerCase()); 15 debugger; >16 return words; 17 }; 18

Trình gỡ lỗi không in ra toàn bộ mảng vì nó khá dài và sẽ khiến kết quả khó đọc hơn. Tuy nhiên, kết quả kết quả đáp ứng mong đợi của ta về những gì nên được lưu trữ: văn bản từ các sentences chia thành các chuỗi chữ thường. Có vẻ như getWords() đang hoạt động bình thường.

Hãy chuyển sang quan sát hàm countWords() . Đầu tiên, hãy mở mảng words để ta không gây ra bất kỳ lỗi trình gỡ lỗi nào khi ta ở điểm ngắt tiếp theo. Trong dấu nhắc lệnh, nhập sau:

  • unwatch('words')

Tiếp theo, nhập c vào dấu nhắc. Tại điểm dừng cuối cùng của ta , ta sẽ thấy điều này trong shell:

Output
break in textHelper.js:29 27 }); 28 >29 debugger; 30 return map; 31 };

Trong hàm này, ta muốn đảm bảo biến map chứa chính xác số lượng mỗi từ trong các câu của ta . Đầu tiên, hãy yêu cầu trình gỡ lỗi xem biến map :

  • watch('map')

Nhấn n để chuyển sang dòng tiếp theo. Trình gỡ lỗi sau đó sẽ hiển thị điều này:

Output
break in textHelper.js:30 Watchers: 0: map = { 12: NaN, 14: NaN, 15: NaN, 18: NaN, 39: NaN, 59: NaN, whale: 1, shark: 1, rhincodon: 1, typus: NaN, gigantic: NaN, ... } 28 29 debugger; >30 return map; 31 }; 32

Điều đó có vẻ không chính xác. Có vẻ như phương pháp đếm từ đang tạo ra kết quả sai. Ta không biết tại sao những giá trị đó lại được nhập, vì vậy bước tiếp theo của ta là gỡ lỗi những gì đang xảy ra trong vòng lặp được sử dụng trên mảng words . Để làm được điều này, ta cần thực hiện một số thay đổi đối với vị trí đặt điểm ngắt.

Đầu tiên, thoát khỏi console gỡ lỗi:

  • .exit

Mở textHelper.js trong editor của bạn để ta có thể chỉnh sửa các điểm ngắt:

  • nano textHelper.js

Đầu tiên, khi biết rằng readFile()getWords() đang hoạt động, ta sẽ xóa các điểm ngắt của chúng. Sau đó, ta muốn xóa điểm ngắt trong countWords() khỏi phần cuối của hàm và thêm hai điểm ngắt mới vào đầu và cuối của khối forEach() .

Chỉnh sửa textHelper.js để nó trông giống như sau:

debugger / textHelper.js
...  const readFile = () => {   let data = fs.readFileSync('sentences.txt');   let sentences = data.toString();   return sentences; };  const getWords = (text) => {   let allSentences = text.split('\n');   let flatSentence = allSentences.join(' ');   let words = flatSentence.split(' ');   words = words.map((word) => word.trim().toLowerCase());   return words; };  const countWords = (words) => {   let map = {};   words.forEach((word) => {     debugger;     if (word in map) {       map[word] = 1;     } else {       map[word] += 1;     }     debugger;   });    return map; };  ... 

Lưu và thoát nano bằng CTRL+X

Hãy bắt đầu lại trình gỡ lỗi bằng lệnh này:

  • node inspect index.js

Để hiểu rõ hơn về những gì đang xảy ra, ta muốn gỡ lỗi một số điều trong vòng lặp. Đầu tiên, hãy cài đặt một watcher for word , đối số được sử dụng trong forEach() chứa chuỗi mà vòng lặp hiện đang xem xét. Trong dấu nhắc gỡ lỗi, hãy nhập vào:

  • watch('word')

Lúc này, ta chỉ theo dõi các biến. Nhưng đồng hồ không giới hạn các biến. Ta có thể xem bất kỳ biểu thức JavaScript hợp lệ nào được sử dụng trong mã của ta .

Về mặt thực tế, ta có thể thêm một trình theo dõi cho word in map điều kiện word in map , nó xác định cách ta đếm số. Trong dấu nhắc gỡ lỗi, hãy tạo trình theo dõi này:

  • watch('word in map')

Cũng hãy thêm một người theo dõi cho giá trị đang được sửa đổi trong biến map :

  • watch('map[word]')

Người theo dõi thậm chí có thể là các biểu thức không được sử dụng trong mã của ta nhưng có thể được đánh giá bằng mã ta có. Hãy xem cách này hoạt động như thế nào bằng cách thêm một trình theo dõi cho độ dài của biến word :

  • watch('word.length')

Bây giờ ta đã cài đặt tất cả các trình theo dõi của bạn , hãy nhập c vào dấu nhắc của trình gỡ lỗi để ta có thể xem phần tử đầu tiên trong vòng lặp của countWords() được đánh giá như thế nào. Trình gỡ lỗi sẽ in kết quả này:

Output
break in textHelper.js:20 Watchers: 0: word = 'whale' 1: word in map = false 2: map[word] = undefined 3: word.length = 5 18 let map = {}; 19 words.forEach((word) => { >20 debugger; 21 if (word in map) { 22 map[word] = 1;

Từ đầu tiên trong vòng lặp là whale . Đến đây, đối tượng map không có key với whale là trống của nó. Từ đó, khi tra cứu whale trong map , ta undefined được. Cuối cùng, chiều dài của whale5 . Điều đó không giúp ta gỡ lỗi vấn đề, nhưng nó xác thực rằng ta có thể xem bất kỳ biểu thức nào có thể được đánh giá bằng mã trong khi gỡ lỗi.

Nhấn c để xem những gì đã thay đổi ở cuối vòng lặp. Trình gỡ lỗi sẽ hiển thị điều này:

Output
break in textHelper.js:26 Watchers: 0: word = 'whale' 1: word in map = true 2: map[word] = NaN 3: word.length = 5 24 map[word] += 1; 25 } >26 debugger; 27 }); 28

Ở cuối vòng lặp, word in map giờ đúng vì biến map chứa khóa whale . Giá trị của map cho khóa whaleNaN , điều này làm nổi bật vấn đề của ta . Các if tuyên bố trong countWords() nghĩa là để cài đặt số lượng của một từ để một nếu nó mới, và thêm một nếu nó tồn tại rồi.

Thủ phạm là if điều kiện tuyên bố của. Ta nên đặt map[word] thành 1 nếu word không được tìm thấy trong map . Ngay bây giờ, ta đang thêm một nếu word được tìm thấy. Ở đầu vòng lặp, map["whale"]undefined . Trong JavaScript, undefined + 1 đánh giá thành NaN — không phải là một số.

Việc sửa chữa này sẽ là để thay đổi tình trạng của if tuyên bố từ (word in map) để (!(word in map)) , sử dụng ! để kiểm tra xem word không có trong map . Hãy thực hiện thay đổi đó trong hàm countWords() để xem điều gì sẽ xảy ra.

Trước tiên, hãy thoát khỏi trình gỡ lỗi:

  • .exit

Bây giờ hãy mở file textHelper.js bằng editor của bạn:

  • nano textHelper.js

Sửa đổi hàm countWords() như sau:

debugger / textHelper.js
...  const countWords = (words) => {   let map = {};   words.forEach((word) => {     if (!(word in map)) {       map[word] = 1;     } else {       map[word] += 1;     }   });    return map; };  ... 

Lưu và đóng editor .

Bây giờ hãy chạy file này mà không cần trình gỡ lỗi. Trong terminal, nhập vào:

  • node index.js

Tập lệnh sẽ xuất ra câu sau:

Output
The most popular word in the text is "whale" with 3 occurrences

Đầu ra này có vẻ cao hơn rất nhiều so với những gì ta nhận được trước đây. Với trình gỡ lỗi, ta đã tìm ra chức năng nào gây ra sự cố và chức năng nào không.

Ta đã gỡ lỗi hai chương trình Node.js khác nhau bằng trình gỡ lỗi CLI tích hợp sẵn. Như vậy, ta có thể cài đặt các điểm ngắt với từ khóa debugger và tạo nhiều người theo dõi khác nhau để quan sát những thay đổi trong trạng thái bên trong. Nhưng đôi khi, mã có thể được gỡ lỗi hiệu quả hơn từ ứng dụng GUI.

Trong phần tiếp theo, ta sẽ sử dụng trình gỡ lỗi trong Công cụ dành cho nhà phát triển của Google Chrome. Ta sẽ khởi động trình gỡ lỗi trong Node.js, chuyển đến trang gỡ lỗi chuyên dụng trong Google Chrome và cài đặt các điểm ngắt và trình theo dõi bằng GUI.

Bước 3 - Gỡ lỗi Node.js bằng Chrome DevTools

Chrome DevTools là một lựa chọn phổ biến để gỡ lỗi Node.js trong trình duyệt web. Vì Node.js sử dụng cùng một công cụ JavaScript V8 mà Chrome sử dụng, trải nghiệm gỡ lỗi được tích hợp nhiều hơn so với các trình gỡ lỗi khác.

Đối với bài tập này, ta sẽ tạo một ứng dụng Node.js mới chạy server HTTP và trả về phản hồi JSON . Sau đó, ta sẽ sử dụng trình gỡ lỗi để cài đặt các điểm ngắt và hiểu sâu hơn về phản hồi nào đang được tạo cho yêu cầu.

Hãy tạo một file mới có tên là server.js sẽ lưu trữ mã server của ta . Mở file trong editor :

  • nano server.js

Ứng dụng này sẽ trả về một JSON với lời Hello World . Nó sẽ có một loạt các thông báo bằng các ngôn ngữ khác nhau. Khi nhận được yêu cầu, nó sẽ chọn ngẫu nhiên một lời chào và gửi lại trong phần thân JSON.

Ứng dụng này sẽ chạy trên server localhost của ta trên cổng :8000 . Nếu bạn muốn tìm hiểu thêm về cách tạo server HTTP với Node.js, hãy đọc hướng dẫn của ta về Cách tạo web server trong Node.js bằng Mô-đun HTTP .

Nhập mã sau vào editor :

debugger / server.js
const http = require("http");  const host = 'localhost'; const port = 8000;  const greetings = ["Hello world", "Hola mundo", "Bonjour le monde", "Hallo Welt", "Salve mundi"];  const getGreeting = function () {   let greeting = greetings[Math.floor(Math.random() * greetings.length)];   return greeting } 

Ta bắt đầu bằng lệnh module http , module này cần thiết để tạo server HTTP. Sau đó, ta cài đặt các biến hostport mà ta sẽ sử dụng sau này để chạy server . Mảng greetings chứa tất cả các lời chào có thể mà server của ta có thể trả về. Hàm getGreeting() chọn ngẫu nhiên một lời chào và trả về nó.

Hãy thêm trình xử lý yêu cầu xử lý các yêu cầu HTTP và thêm mã để chạy server của ta . Tiếp tục chỉnh sửa module Node.js bằng lệnh như sau:

debugger / server.js
...  const requestListener = function (req, res) {   let message = getGreeting();   res.setHeader("Content-Type", "application/json");   res.writeHead(200);   res.end(`{"message": "${message}"}`); };  const server = http.createServer(requestListener); server.listen(port, host, () => {   console.log(`Server is running on http://${host}:${port}`); }); 

Server của ta hiện đã sẵn sàng để sử dụng, vì vậy hãy cài đặt trình gỡ lỗi Chrome.

Ta có thể khởi động trình gỡ lỗi Chrome bằng lệnh sau:

  • node --inspect server.js

Lưu ý: Hãy ghi nhớ sự khác biệt giữa trình gỡ lỗi CLI và các lệnh trình gỡ lỗi Chrome. Khi sử dụng CLI, bạn sử dụng thanh inspect . Khi sử dụng Chrome, bạn sử dụng --inspect .

Sau khi khởi động trình gỡ lỗi, bạn sẽ tìm thấy kết quả sau:

Output
Debugger listening on ws://127.0.0.1:9229/996cfbaf-78ca-4ebd-9fd5-893888efe8b3 For help, see: https://nodejs.org/en/docs/inspector Server is running on http://localhost:8000

Bây giờ, hãy mở Google Chrome hoặc Chromium và nhập chrome://inspect vào thanh địa chỉ. Microsoft Edge cũng sử dụng công cụ JavaScript V8 và do đó có thể sử dụng cùng một trình gỡ lỗi. Nếu bạn đang sử dụng Microsoft Edge, hãy chuyển đến edge://inspect .

Sau khi chuyển đến URL, bạn sẽ thấy trang sau:

Ảnh chụp màn hình trang "kiểm tra" của Google Chome

Trong tiêu đề Thiết bị , hãy nhấp vào nút Mở Công cụ dành riêng cho DevTools cho Node . Một cái cửa sổ mới sẽ bật lên:

Ảnh chụp màn hình cửa sổ gỡ lỗi

Hiện ta có thể gỡ lỗi mã Node.js của bạn bằng Chrome. Điều hướng đến tab Nguồn nếu chưa có. Ở phía bên trái, mở rộng cây file và chọn server.js :

Ảnh chụp màn hình tab Nguồn của cửa sổ trình gỡ lỗi

Hãy thêm một điểm ngắt vào mã của ta . Ta muốn dừng lại khi server đã chọn một lời chào và sắp trả lại lời chào đó. Nhấp vào dòng số 10 trong console gỡ lỗi. Một chấm màu đỏ sẽ xuất hiện bên cạnh số và console bên phải sẽ cho biết một điểm ngắt mới đã được thêm vào:

Ảnh chụp màn hình về việc thêm một điểm ngắt trong trình gỡ lỗi Chrome

Bây giờ hãy thêm một biểu thức đồng hồ. Trên console bên phải, nhấp vào mũi tên bên cạnh tiêu đề Xem để mở danh sách từ xem, sau đó nhấp vào + . Nhập greeting và nhấn ENTER để ta có thể quan sát giá trị của nó khi xử lý một yêu cầu.

Tiếp theo, hãy gỡ lỗi mã của ta . Mở cửa sổ trình duyệt mới và chuyển đến http://localhost:8000 — địa chỉ mà server Node.js đang chạy. Khi nhấn ENTER , ta sẽ không nhận được phản hồi ngay lập tức. Thay vào đó, cửa sổ gỡ lỗi sẽ bật lên . Nếu nó không đi vào tiêu điểm ngay lập tức, hãy chuyển đến cửa sổ gỡ lỗi để xem điều này:

Ảnh chụp màn hình về việc thực thi chương trình bị tạm dừng trong Chrome

Trình gỡ lỗi tạm dừng phản hồi của server nơi ta đặt điểm ngắt. Các biến mà ta xem được cập nhật trong console bên phải và cũng trong dòng mã đã tạo ra nó.

Hãy hoàn thành việc thực thi phản hồi bằng cách nhấn nút tiếp tục ở bảng bên phải, ngay phía trên Tạm dừng trên điểm ngắt . Khi phản hồi hoàn tất, bạn sẽ thấy phản hồi JSON thành công trong cửa sổ trình duyệt được sử dụng để nói chuyện với server Node.js:

{"message": "Hello world"} 

Bằng cách này, Chrome DevTools không yêu cầu thay đổi mã để thêm các điểm ngắt. Nếu bạn muốn sử dụng các ứng dụng đồ họa qua dòng lệnh để gỡ lỗi, thì Chrome DevTools phù hợp hơn với bạn.

Kết luận

Trong bài viết này, ta đã gỡ lỗi các ứng dụng Node.js mẫu bằng cách cài đặt người theo dõi để quan sát trạng thái ứng dụng của ta , sau đó bằng cách thêm các điểm ngắt để cho phép ta tạm dừng thực thi tại các điểm khác nhau trong quá trình thực thi chương trình của ta . Ta đã hoàn thành việc này bằng cách sử dụng cả trình gỡ lỗi CLI tích hợp sẵn và Công cụ dành cho nhà phát triển của Google Chrome.

Nhiều nhà phát triển Node.js đăng nhập vào console để gỡ lỗi mã của họ. Mặc dù điều này hữu ích, nhưng nó không linh hoạt bằng việc có thể tạm dừng thực thi và xem các thay đổi trạng thái khác nhau. Do đó, sử dụng các công cụ gỡ lỗi thường hiệu quả hơn và sẽ tiết kiệm thời gian trong quá trình phát triển một dự án.

Để tìm hiểu thêm về các công cụ gỡ lỗi này, bạn có thể đọc tài liệu Node.js hoặc tài liệu Chrome DevTools . Nếu bạn muốn tiếp tục học Node.js, bạn có thể quay lại loạt bài Cách viết mã trong Node.js hoặc duyệt qua các dự án lập trình và cài đặt trên trang chủ đề Node của ta .


Tags:

Các tin liên quan