2012-05-05 8 views
6

He intentado mirar global, pero solo contiene variables, no funciones. ¿Cómo puedo enumerar todas las funciones creadas en mi script?¿Cómo puedo hacer una lista de todas las funciones en mi script de nodo js?

+0

¿cuál sería el caso de uso para esto? – mihai

+1

Un script AOP personalizado que estoy creando para una aplicación de nodo. Quiero usarlo para cosas como perfilado, regulación y políticas de seguridad personalizadas. Revisé Dojo pero tuve algunos problemas iniciales solo cargándolos en la aplicación de mi nodo, así que pensé en escribir un script personalizado. No debería ser tan difícil. – Trindaz

+0

¿Desea hacer esto desde el script? No estoy seguro de que sea tan fácil porque puede tener funciones anónimas, funciones dentro de cierres, funciones creadas dinámicamente, etc. – mihai

Respuesta

5

Ejecute la depuración de nodo desde la línea de comandos con el archivo que desea examinar. A continuación, puede utilizar la lista (un número grande aquí)

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> 
2

Si la función tiene un nombre, que va a aparecer en mundial muy bien:

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] 
+0

Podría haber jurado que probé esto y descubrí que las funciones no estaban disponibles en global, pero su script también funciona bien para mí. – Trindaz

+1

Lo siento Marcar esto como respuesta: funciona bien en la consola, pero para la secuencia de comandos funciona a() {return 1; } para (var k en global) console.log (k) no muestra la función 'a'. – Trindaz

+0

Derecha.Resulta que, en el modo interactivo, esas definiciones pasan a ser globales, pero si ejecuta un script desde "node script.js", terminan como locals en el módulo. Definitivamente hay una forma de obtener esa información del depurador, pero no estoy seguro si el script puede acceder a ella ... –

0

Si usted quiere hacer algo de AOP, la ruta es AST.

Puede construir su propio marco AOP con algo como: http://esprima.org.

O usted podría intentar node-burrito, excelente para los aspectos no tan complejas:

var burrito = require('burrito'); 

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

generará

qqq(somecall()) 
3

Esto es imposible en el nodo sin necesidad de herramientas que reflejan más avanzadas como el depurador .

La única forma de hacerlo sería usar __parent__ que se eliminó debido a problemas de seguridad y otras cosas. Como dijo Mark Bessey, cuando ejecuta el guión, esas variables se convierten en variables de cierre del módulo. No puede acceder a ellos en ningún otro lugar sin exportarlos explícitamente.

Esto no es un error, es por diseño. Es solo cómo funciona el nodo. Sin embargo, si le preguntas a los usuarios a escribir la función de expresión asignaciones, todo funcionaría A-OK:

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

A continuación, puede reflejar fácilmente en module.exports y enumerar y obtener todos los nombres de las funciones.

Cuestiones relacionadas