Node.js如何打印触发模块错误的主文件对应代码行及行号
Node.js 模块报错打印调用方代码行号方案
实现逻辑
利用Node.js中Error对象自带的堆栈跟踪属性stack,过滤模块自身的栈帧后提取外部调用方的位置信息。
代码实现
模块文件 xyz.js 代码
// xyz.js function testMethod(params) { // 示例参数校验:判断入参是否为数字 if (typeof params !== 'number') { const err = new Error(`参数类型错误,期望number类型,实际得到${typeof params}`); // 拆分堆栈为逐行信息 const stackLines = err.stack.split('\n'); let callerLine = ''; // 遍历找到第一个不属于当前xyz.js的栈帧 for (let i = 1; i < stackLines.length; i++) { if (!stackLines[i].includes('xyz.js')) { callerLine = stackLines[i].trim(); break; } } // 解析行号列号并打印 const matchRes = callerLine.match(/(?:\(|at )([^:]+):(\d+):(\d+)/); if (matchRes) { const [, filePath, lineNum, colNum] = matchRes; console.error(`错误触发位置:${filePath},第${lineNum}行,第${colNum}列`); } // 可选:继续抛出错误中断执行 throw err; } // 正常业务逻辑 return params * 2; } module.exports = { testMethod };
入口文件 main.js 测试代码
// main.js const { testMethod } = require('./xyz.js'); // 传入非法字符串参数触发错误 testMethod('123'); // 该行调用会被定位到
注意:如果没有自定义打印的需求,不需要额外解析堆栈,直接抛出Error即可,Node.js默认打印的错误堆栈会自动展示所有调用链的行号信息,包含
main.js的调用位置。
内容的提问来源于stack exchange,提问作者Himanshu Singh Chauhan
相关产品推荐
相关产品推荐

