首先想到的是console.log(), 直接在控制台输出想要调试的内容,看看是不是符合预期。其次是util模块下面有一个debuglog 方法,它有条件地把log 信息写入STDERR。新建index.js
const util = require('util'); const debuglog = util.debuglog('myapp'); debuglog('myapp debug messag [%d]', 123);
当NODE_DEBUG环境变量设置成myapp 或 *(my*), debug 信息将要显示出来。NODE_DEBUG=myapp node index.js, 可以看到 MYAPP 6443: myapp debug messag [123] ,6443 是程序进程ID。但当程序比较大时,这种代码调试的方式就有点麻烦了,就要用到断点调试。
Node.js Debugger
断点调试的第一种方式就是使用Node.js自带的debugger。使用方式是,启动Node.js程序时,带上inspect。假设要调试下面index.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)
node inspect index.js 就可以启动Node.js 自带的断点调式。
第一行显示了debug 服务器的URL, 使用外在的debug客户端时,比如chrome 开发者工具,有用。服务器监听的是localhost:9229。Debugger attached 表示调试器已经附加成功了,可以开始调试了。Break on start in index.js:1, 表示断点放在index.js的第一行,程序在index.js第一行停止执行了。> 1 也表示程序执行到哪一行。debug > 光标在闪烁,表示debugger正在接受命令。debugger 可以接受以下命令
c 或 cont: 继续执行到下一个断点,或程序结束。
n 或 next: 移动到下一行代码。
s 或 step:进入到函数内部执行
o:退出函数执行
pause: 暂停程序执行
知道了debugger 可以接受的命令后,在 debug > 后面输入n , debugger 到了第3行代码,再输入n, 到了第5行代码,开始执行循环,let i = 0中的 0进行了高亮。在执行循环的过程中,可以监听变量 i 和totalOrders 的变化。在命令行中输入watch(“totalOrders”), watch的参数是字符串,字符串的内容是要监听的变量名。再输入watch(‘i’)
此时输入n,可以看到 watcher 的变量值。不停地输入n, 就会一步一步地进行调试,这就是逐步调试。
i = 5 时,程序出问题了,是的,数组的最大索引是4。找到问题了,可以退出debugger 了。输入 .exit, 然后按enter。此时,可以修改源代码了。逐步调试对于大型项目,不太合适,可以在程序中写debugger; 创建断点,然后在debugger 中输入c,执行到下一个断点,执行到某个断点后,可以结合逐步调试的方式,wacth 变量,比如watch(‘sentences’)。再次按c, 执行到下一个断点,sentences 变量可能就不存在了,这时就要先取消watch, unwatch(‘sentences’)。 在这个断点处,你又想watch 某个变量,可以再次watch, 比如 watch(‘word’),再次取消,比如unwatch(‘word’)。 比如下面这段代码
const countWords = (words) => { let map = {}; words.forEach((word) => { debugger; if (word in map) { map[word] = 1; } else { map[word] += 1; } debugger; }); return map; };
除了watch变量后, 还可以watch 表达式,watch(‘word in map’), watch(‘map[word]’), watch(‘word.length’)
Chrome 浏览器开发者工具
创建一个服务器程序,用开发者工具调试一下。新建server.js
const http = require("http"); 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; } 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(8000, () => { console.log(`Server is running on 8000`); });
如果要使用开发者工具调试Node.js程序,就要带–inspect 启动程序。node –inspect server.js 或nodemon –inspect server.js, 可以看到控制台上 Debugger listening on ws://127.0.0.1:9229/6122e2b5-a165-434b-ac45-51657da66545,打开chrome,地址栏中输入 chrome://inspect,看到一个Remote Target, 它下面就是启动的web服务器
如果Remote Target下面没有内容,就要勾选它上面的复选框,Discover network targets,点击config,也可以看到它是监听localhost 9229,正好是node –inspect server.js 启动的服务。有了Target之后,可以直接点击Open dedicated DevTools for Node,弹窗,找到Source面板,选中它下面的node面板,展开它下面的文件夹,找到servere.js, 如下图所示
可以debug了,打个断点,watch变量
浏览器中输入localhost:8000, 向服务器发送请求,服务器在断点处停止了。 还有一种调试方法是点击Target 下面的inspect, 也是弹窗,不过Source 面板下面没有Node,只有FileSystem,这时要点击Add Folder to workspace, 把要debug的web项目添加进来。这里要注意,添加的时候,开发者工具顶部有一个访问权限,
可以看到项目添加进去了,可以debug 了。
原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/272823.html