Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何列出节点js脚本中的所有函数?_Javascript_Node.js_Reflection - Fatal编程技术网

Javascript 如何列出节点js脚本中的所有函数?

Javascript 如何列出节点js脚本中的所有函数?,javascript,node.js,reflection,Javascript,Node.js,Reflection,我试过查看global,但它只包含变量,不包含函数。如何列出脚本中创建的所有函数?cli: 图形用户界面: 还有一个功能更强大的node inspector版本正在开发中。使用要查看的文件从命令行运行node debug。然后你可以使用列表(这里有一些大数字) node debug mini_file_server.js 脚本 26:mini_file_server.js 调试>列表(1000) 1 var http=require('http'), 2 util=require('util')

我试过查看
global
,但它只包含变量,不包含函数。如何列出脚本中创建的所有函数?

cli:

图形用户界面:


还有一个功能更强大的node inspector版本正在开发中。

使用要查看的文件从命令行运行node debug。然后你可以使用列表(这里有一些大数字)

node debug mini_file_server.js
<调试器正在端口5858上侦听
连接。。。好啊
调试>脚本
26:mini_file_server.js
调试>列表(1000)
1 var http=require('http'),
2 util=require('util'),
3 fs=要求('fs');
4.
5 server=http.createServer(函数(req,res){
6 var stream=fs.createReadStream('one.html'),
7 stream2=fs.createReadStream('two.html');
8.控制台日志(流);
9控制台日志(stream2);
10 stream.on('end',function(){
11.2.管道(res,{end:false});
12     });
13
14 stream2.on('end',function(){
15 res.end(“仅此而已!”);
16     });
17
18 res.writeHead(200,{'Content-Type':'text/plain'});
19流管道(res,{end:false});
20.2.管道(res,{end:true});
21
听(8001);
23 });
调试>

如果函数有名称,它将显示在global just fine中:

mb-work-laptop:~ markbessey$ node
> for (var k in global) { console.log(k); }
global
process
GLOBAL
root
Buffer
setTimeout
setInterval
clearTimeout
clearInterval
console
module
require
k
> function z(a) { return a*10; }
> for (var k in global) { console.log(k); }
global
process
GLOBAL
root
Buffer
setTimeout
setInterval
clearTimeout
clearInterval
console
module
require
k
z
> 
> global.z
[Function: z]

如果你想做一些AOP,路线是AST

您可以使用以下内容构建自己的AOP框架:

或者您也可以尝试,非常适合于不太复杂的方面:

var burrito = require('burrito');

var src = burrito('someCall()', function (node) {
    if (node.name === 'call') node.wrap('qqq(%s)');
});
将产生

qqq(somecall())

在节点中,如果没有更高级的反映工具(如调试器),这是不可能的

唯一的方法是使用由于安全问题和其他原因而被删除的。正如Mark Bessey所说,当您运行脚本时,这些变量将成为模块闭包变量。如果不显式导出它们,则无法在其他位置访问它们

这不是一个bug,它是经过设计的。这就是node的工作方式。但是,如果您只要求用户编写函数表达式赋值,则所有这些都可以正常工作:

module.exports = {
    a:function(){
        //same logic you had in the function declaration
    }
}

然后,您可以轻松地反思和枚举module.exports并获取所有函数名。

这将是一个什么样的用例?我正在为节点应用程序创建的自定义AOP脚本。我想将其用于分析、限制和自定义安全策略。我签出了Dojo,但在将其加载到我的节点应用程序时遇到了一些早期问题,所以我想我应该编写一个自定义脚本。这应该没那么难。所以你想从脚本本身来做这件事?我不确定这有多容易,因为你可以拥有匿名函数、闭包中的函数、动态创建的函数等等。这是真的-但在我的例子中,只将方面应用到“根级别”命名函数将被浏览。我可以发誓我已经为此进行了测试,发现函数在全局,但是你的脚本对我来说也很好。对不起,马克,我已经将其取消标记为答案-它在控制台中工作得很好,但是对于脚本函数a(){return 1;}for(var k in global)console.log(k),它没有显示函数“a”。对。事实证明,在交互模式下,这些定义进入全局,但如果您从“node script.js”运行脚本,它们最终将作为模块中的局部变量。确实有一种方法可以从调试器获取该信息,但不确定脚本是否可以访问该信息。。。
module.exports = {
    a:function(){
        //same logic you had in the function declaration
    }
}