我如何列出我的节点js脚本中的所有function?

我试过看global ,但它只包含variables,而不是函数。 如何列出在我的脚本中创build的所有function?

使用您要查看的文件从命令行运行节点debugging。 那么你可以使用列表(这里有一些大数字)

 node debug mini_file_server.js < debugger listening on port 5858 connecting... ok debug> scripts 26: mini_file_server.js debug> list(1000) 1 var http = require('http'), 2 util = require('util'), 3 fs = require('fs'); 4 5 server = http.createServer(function(req, res){ 6 var stream = fs.createReadStream('one.html'), 7 stream2 = fs.createReadStream('two.html'); 8 console.log(stream); 9 console.log(stream2); 10 stream.on('end', function(){ 11 stream2.pipe(res, { end:false}); 12 }); 13 14 stream2.on('end', function(){ 15 res.end("Thats all!"); 16 }); 17 18 res.writeHead(200, {'Content-Type' : 'text/plain'}); 19 stream.pipe(res, { end:false}); 20 stream2.pipe(res, { end:true}); 21 22 }).listen(8001); 23 }); debug> 

如果没有像debugging器这样的更高级的reflection工具,这是不可能的。

这样做的唯一方法是使用__parent__ ,由于安全问题和其他事情而被删除。 就像Mark Bessey所说的那样,当你运行脚本的时候,这些variables就变成了模块闭包variables。 您不能在没有明确导出它们的地方访问它们。

这不是一个错误,它是由devise。 这只是节点的工作原理。 但是,如果您只是要求用户编写函数expression式分配,则所有函数都可以正常工作:

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

然后,你可以轻松地reflection和枚举module.exports并获得所有的函数名称。

如果函数有一个名字,它会显示在全局就好:

 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] 

cli: http : //nodejs.org/docs/v0.3.7/api/debugger.html

gui: https : //github.com/dannycoates/node-inspector

另外还有一个https://github.com/c4milo/node-webkit-agent ,它将是一个更强大的节点检查器版本。

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

你可以build立你自己的AOP框架,如: http : //esprima.org 。

或者你可以尝试节点卷饼 ,不是很复杂的方面:

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

会产生

 qqq(somecall())