确定NodeJS中给定引用的函数文件/行的位置



我想不出如何做到这一点,这让我觉得这是某种反模式的,或者说是不可能的。如果有人对如何处理我的情况有任何更好的想法,欢迎提出建议。

我有一个遗留的代码库,在某个时刻我检索函数引用并调用该函数。这些函数调用应该返回一个结果,但有时它们缺少返回语句。目前,如果返回的值为null,我会抛出一个错误,但这只会给我一个到调用函数的引擎位置的堆栈跟踪,而不是函数本身。

有没有什么方法可以确定函数的文件名/编号,或者强制函数抛出错误,从而生成实际函数的堆栈竞争?

Javascript语言中没有这样的功能。它不是反模式的,只是不是语言所支持的。函数不需要有return语句,如果不返回值,也没有办法强制它抛出异常。

在没有看到任何相关代码的情况下,我可以提供一些建议:

  1. 在启动函数调用的代码行设置断点。然后,跟踪调试器中的函数。您可以根据需要深入了解,每次进入新的函数调用时,它会向你显示你所在的文件和行号。当我对某些模块(内置于nodejs或我使用的外部模块(的某些行为感到困惑时,我经常使用这种技术,而且还不清楚如何在Github上为它找到合适的代码。我只需进入它,就可以立即看到代码,并观察它根据需要逐行执行,以解决我遇到的任何问题调查。

  2. 假设你调用的这个函数需要一些参数,你可以给它一些伪参数,希望能触发它抛出某种异常,然后你可以看到该异常的堆栈跟踪。例如,如果它期望一个非可选对象作为参数,则可以传递null,看看这是否会触发异常。如果它期望回调,您可以传递一个非函数,看看它是否触发了异常。

  3. 至于函数的名称,如果函数有一个实际的名称(它不是匿名的(,并且fn是你的函数引用,那么你可以做console.log(fn.name),看看是否有名称。您还可以检查fn.toString(),看看它是否显示了函数的源代码。有时它会,如果函数是一个命名函数,它可能会显示它的名称。这不会显示它在哪个文件中,但你可以用grep查找你在源文件中看到的东西来找到它

下面是第3点的一个例子:

function hello() {
return "hi";
}
// create function reference that points to my function
const fn = hello;
// log info on that function reference
console.log(fn.name);
console.log(fn.toString());

最新更新