2012-05-05 18 views
6

Próbowałem, patrząc na global, ale zawiera tylko zmienne, a nie funkcje. Jak mogę wyświetlić wszystkie funkcje utworzone w moim skrypcie?Jak mogę wyświetlić wszystkie funkcje w skrypcie js mojego węzła?

+0

jaki byłby tego przykład? – mihai

+1

Niestandardowy skrypt AOP, który tworzę dla aplikacji węzła. Chcę go używać do takich funkcji, jak profilowanie, ograniczanie i niestandardowe zasady zabezpieczeń. Sprawdziłem Dojo, ale miałem kilka wczesnych problemów po prostu załadowanie go do mojej aplikacji węzła, więc pomyślałem, że napiszę własny skrypt. To nie powinno być takie trudne. – Trindaz

+0

Więc chcesz to zrobić z poziomu samego skryptu? Nie jestem pewien, czy to jest takie proste, ponieważ możesz mieć anonimowe funkcje, funkcje wewnątrz zamknięć, funkcje tworzone dynamicznie itd. – mihai

Odpowiedz

5

Uruchom węzeł debugowania z wiersza poleceń z plikiem, który chcesz obejrzeć. Następnie można użyć listy (niektóre dużą liczbę tutaj)

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

Jeśli funkcja ma swoją nazwę, będzie to widoczne w globalnym porządku:

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

Mogłem przysiąc, że sprawdziłem to i okazało się, że funkcje nie są dostępne w wersji globalnej, ale twój skrypt działa również dla mnie. – Trindaz

+1

Niestety, zaznaczyłem to jako odpowiedź - działa dobrze na konsoli, ale dla skryptu funkcja a() {return 1; } dla (var k w globalnym) console.log (k) nie wyświetla funkcji "a". – Trindaz

+0

Dobrze. –

0

Jeśli chcesz zrobić kilka AOP, trasa to AST.

Można zbudować własne ramy AOP z czymś takim jak: http://esprima.org.

Albo można spróbować node-burrito, doskonałe dla niezbyt skomplikowanych aspektach:

var burrito = require('burrito'); 

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

wygeneruje

qqq(somecall()) 
3

jest to niemożliwe bez węzła w bardziej zaawansowanych narzędzi, takich jak odbijających debugger.

Jedynym sposobem na to jest użycie __parent__, który został usunięty z powodu problemów z bezpieczeństwem i innych rzeczy. Jak powiedział Mark Bessey, po uruchomieniu skryptu zmienne te stają się zmiennymi zamykającymi moduł. Nie można uzyskać do nich dostępu w innym miejscu bez wyraźnego ich eksportu.

To nie jest błąd, jest zgodny z projektem. Tak działa węzeł. Jednakże, jeśli po prostu zapytać użytkownikom do pisania funkcji przypisania ekspresji, wszystko będzie działać a-ok:

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

Następnie można łatwo refleksji i wyliczyć module.exports i uzyskać wszystkie nazwy funkcji.

Powiązane problemy