MST

星途 面试题库

面试题:Node.js调试技巧之断点调试

假设你正在使用Node.js开发一个复杂的Web应用程序,其中涉及多个模块和异步操作。请阐述如何使用Node.js内置的调试器(如node inspect)在代码中设置断点,尤其是在异步函数和回调函数中进行断点调试,并说明如何利用调试会话来排查问题。
37.6万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试
  1. 使用node inspect设置断点
    • 在普通代码中
      • 在Node.js文件中,使用debugger关键字设置断点。例如:
function add(a, b) {
    let result = a + b;
    debugger; // 设置断点
    return result;
}
add(2, 3);
 - 然后在终端运行`node inspect your - file.js`,调试器会在遇到`debugger`关键字处暂停。
  • 在异步函数中
    • 对于异步函数,同样可以在函数内部使用debugger关键字。例如:
async function asyncFunction() {
    let value = await Promise.resolve(42);
    debugger;
    console.log('Value:', value);
}
asyncFunction();
 - 运行`node inspect your - file.js`,当异步函数执行到`debugger`处时,调试器会暂停。
  • 在回调函数中
    • 在回调函数内部设置debugger。例如:
const fs = require('fs');
fs.readFile('example.txt', 'utf8', function (err, data) {
    debugger;
    if (err) {
        console.error(err);
        return;
    }
    console.log(data);
});
 - 运行`node inspect your - file.js`,当回调函数被调用执行到`debugger`处时,调试器会暂停。

2. 利用调试会话排查问题

  • 查看变量值
    • 当调试器暂停在断点处时,可以使用repl命令进入交互式环境,查看当前作用域内的变量值。例如,在add函数的断点处,可以在调试器的repl中输入result,查看add函数计算结果的值。
  • 单步执行
    • 使用n(next)命令执行下一行代码,但不进入函数调用内部;使用s(step)命令执行下一行代码,并进入函数调用内部;使用o(out)命令从当前函数返回。例如,在异步函数asyncFunction中,使用n可以执行到console.log语句,使用s可以进入Promise.resolve内部(如果有自定义的Promise实现逻辑)。
  • 查看调用栈
    • 使用bt(backtrace)命令查看当前的调用栈,了解函数调用的层级关系,这有助于定位问题是从哪里发起的。例如,在复杂的异步调用链中,通过调用栈可以清晰看到是哪个模块、哪个函数触发了当前的异步操作。
  • 条件断点
    • 在Chrome DevTools等支持的调试工具(与node inspect配合)中,可以设置条件断点。例如,在一个循环中,可以设置断点只在循环变量达到特定值时触发,这对于排查特定条件下出现的问题很有帮助。