2012-05-05 30 views
6

Tôi đã thử xem global, nhưng nó chỉ chứa biến, chứ không phải chức năng. Làm thế nào tôi có thể liệt kê tất cả các chức năng được tạo trong tập lệnh của tôi?Tôi có thể liệt kê tất cả các chức năng trong tập lệnh js nút của mình như thế nào?

+0

trường hợp sử dụng cho trường hợp này là gì? – mihai

+1

Tập lệnh AOP tùy chỉnh mà tôi đang tạo cho một ứng dụng nút. Tôi muốn sử dụng nó cho những thứ như lược tả, điều chỉnh và các chính sách bảo mật tùy chỉnh. Tôi đã kiểm tra Dojo nhưng có một số probs sớm chỉ tải nó vào ứng dụng nút của tôi vì vậy tôi nghĩ rằng tôi muốn viết một kịch bản tùy chỉnh. Nó không phải là khó khăn. – Trindaz

+0

Vì vậy, bạn muốn thực hiện điều này từ bên trong tập lệnh? Tôi không chắc nó dễ dàng như vậy bởi vì bạn có thể có các chức năng ẩn danh, chức năng bên trong bao đóng, chức năng được tạo động… – mihai

Trả lời

5

Chạy gỡ lỗi nút từ dòng lệnh với tệp bạn muốn xem. Sau đó, bạn có thể sử dụng danh sách (một số số lớn ở đây)

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

Nếu chức năng có một cái tên, nó sẽ hiển thị trong toàn cầu tốt:

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

Tôi có thể thề rằng tôi đã thử nghiệm cho điều này và thấy rằng các chức năng không có sẵn trên toàn cầu, nhưng kịch bản của bạn cũng làm việc tốt cho tôi. – Trindaz

+1

Xin lỗi Mark Tôi đã đánh dấu điều này là câu trả lời - nó hoạt động tốt trong giao diện điều khiển, nhưng đối với tập lệnh chức năng a() {return 1; } cho (var k trong toàn cục) console.log (k) nó không hiển thị hàm 'a'. – Trindaz

+0

Phải.Khi nó quay ra, trong chế độ tương tác, các định nghĩa đó đi vào toàn cầu, nhưng nếu bạn chạy một tập lệnh từ "nút script.js", chúng sẽ kết thúc với tư cách là người dân địa phương trong mô-đun. Chắc chắn có một cách để lấy thông tin đó từ trình gỡ lỗi, nhưng không chắc liệu tập lệnh có thể truy cập vào nó hay không ... –

0

Nếu bạn muốn làm một số AOP, tuyến đường là AST.

Bạn có thể xây dựng khung AOP của riêng mình với một cái gì đó như: http://esprima.org.

Hoặc bạn có thể thử node-burrito, tuyệt vời cho các khía cạnh không quá phức tạp:

var burrito = require('burrito'); 

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

sẽ tạo

qqq(somecall()) 
3

này là không thể trong nút mà không cần công cụ phản ánh cao cấp hơn như debugger.

Cách duy nhất để thực hiện việc này là sử dụng __parent__ đã bị xóa do sự cố bảo mật và các vấn đề khác. Giống như Mark Bessey cho biết, khi bạn chạy tập lệnh, các biến đó sẽ trở thành biến đóng của mô-đun. Bạn không thể truy cập chúng ở nơi khác mà không xuất khẩu chúng một cách rõ ràng.

Đây không phải là lỗi, theo thiết kế. Nó chỉ là cách nút hoạt động. Tuy nhiên, nếu bạn chỉ cần yêu cầu người dùng của bạn để viết bài tập biểu hiện chức năng, tất cả sẽ làm việc một-ok:

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

Sau đó, bạn có thể dễ dàng suy nghĩ về và liệt kê module.exports và nhận được tất cả các tên hàm.

Các vấn đề liên quan