ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Node.js的代码调试debug

2022-07-07 22:01:40  阅读:233  来源: 互联网

标签:Node debugger watch js debug 断点 调试


首先想到的是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 了。

标签:Node,debugger,watch,js,debug,断点,调试
来源: https://www.cnblogs.com/SamWeb/p/16448021.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有