2012-05-05 12 views
6

global'a bakmayı denedim, ancak yalnızca değişkenler içeriyor, işlevler değil. Komutumda oluşturulan tüm işlevleri nasıl listeleyebilirim?Düğüm js komut dosyasındaki tüm işlevleri nasıl listeleyebilirim?

+0

Bunun için kullanım durumu ne olurdu? – mihai

+1

Düğüm uygulaması için oluşturduğum özel bir AOP komut dosyası. Profil oluşturma, daraltma ve özel güvenlik politikaları gibi şeyler için kullanmak istiyorum. Dojo'yu kontrol ettim ama bazı ilk probs'ları düğüm uygulamasına yükledim, böylece özel bir senaryo yazacağımı düşündüm. O kadar da zor olmamalı. – Trindaz

+0

Yani bunu senaryonun içinden yapmak ister misin? Bu kadar kolay olmadığından emin değilim çünkü anonim işlevlere sahip olabilirsiniz, kapakların içindeki işlevler, dinamik olarak oluşturulmuş işlevler vb. – mihai

cevap

5

Düğüm ayıklamasını, bakmak istediğiniz dosyayla komut satırından çalıştırın. Sonra işlev bir adı varsa

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

, küresel gayet kadar göstereceğiz listesi (burada bazı büyük sayı) kullanabilirsiniz:

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

Yemin edebilirdik bunun için test ettim ve global olarak işlevlerin mevcut olmadığını, ancak senaryonun benim için de iyi çalıştığını fark ettim. – Trindaz

+1

Üzgünüz Mark Ben bunu cevap olarak işaretledim - konsolda gayet iyi çalışıyor, ancak script için fonksiyonu a() {return 1; } için (globalde var k) console.log (k) 'a' işlevini göstermez. – Trindaz

+0

Sağ.Anlaşıldığı gibi, etkileşimli modda, bu tanımlamalar global olarak gerçekleşir, ancak "node script.js" den bir betik çalıştırırsanız, modülde yerliler olur. Bu bilgiyi hata ayıklayıcısından almanın bir yolu kesinlikle var, ancak komut dosyasının ona erişip erişemeyeceğinden emin değilsiniz ... –

0

bazı AOP'yi yapmak istiyorsanız, rota AST'dir.

Kendi AOP çerçevenizi http://esprima.org gibi bir şeyle oluşturabilirsiniz.

Yoksa bu kadar karmaşık değil yönleri için mükemmel node-burrito, deneyebilirsiniz:

var burrito = require('burrito'); 

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

qqq(somecall()) 
3

Bu ayıklayıcıya gibi daha gelişmiş yansıtan araçlar olmadan düğümünde imkansızdır üretecektir.

Bunu yapmanın tek yolu, güvenlik sorunları ve diğer şeyler nedeniyle kaldırılmış olan __parent__ kullanmak olacaktır. Mark Bessey gibi, senaryoyu çalıştırdığınızda, bu değişkenler modül kapanış değişkenleri olur. Bunları açıkça dışa aktarmadan başka bir yere erişemezsiniz.

Bu bir hata değildir, tasarım gereğidir. Sadece düğüm nasıl çalışır? Sadece fonksiyon ifade atamaları yazmak için kullanıcılardan Ancak, bütün bir-ok çalışacak: Sonra

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

, kolayca yansıtmak ve module.exports numaralandırmak ve tüm işlev adları alabilirsiniz.

İlgili konular