Node.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 自带的断点调式。

Node.js的代码调试debug

   第一行显示了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’)

Node.js的代码调试debug

  此时输入n,可以看到 watcher 的变量值。不停地输入n, 就会一步一步地进行调试,这就是逐步调试。

Node.js的代码调试debug

   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服务器

Node.js的代码调试debug

  如果Remote Target下面没有内容,就要勾选它上面的复选框,Discover network targets,点击config,也可以看到它是监听localhost 9229,正好是node –inspect server.js 启动的服务。有了Target之后,可以直接点击Open dedicated DevTools for Node,弹窗,找到Source面板,选中它下面的node面板,展开它下面的文件夹,找到servere.js, 如下图所示

Node.js的代码调试debug

  可以debug了,打个断点,watch变量

Node.js的代码调试debug

  浏览器中输入localhost:8000, 向服务器发送请求,服务器在断点处停止了。 还有一种调试方法是点击Target 下面的inspect, 也是弹窗,不过Source 面板下面没有Node,只有FileSystem,这时要点击Add Folder to workspace, 把要debug的web项目添加进来。这里要注意,添加的时候,开发者工具顶部有一个访问权限,

Node.js的代码调试debug

 

  可以看到项目添加进去了,可以debug 了。

原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/272823.html

(0)
上一篇 2022年7月9日
下一篇 2022年7月9日

相关推荐

发表回复

登录后才能评论