2013-04-07 33 views
7

Tôi đã viết một mô-đun trong node.js thực hiện một số hoạt động mạng. Tôi đã viết một kịch bản nhỏ sử dụng mô đun này (biến số check bên dưới). Có vẻ như sau:node.js: chương trình hoặc thoát đột ngột hoặc chỉ bị treo

check(obj, function (err, results) { 
    // ... 
    console.log("Check completed"); 
}); 

Đây là một điều thú vị. Khi mã này thực hiện như một phần của thử nghiệm mocha, kiểm tra sẽ thoát như mong đợi. Tôi thấy bản tường trình được in và quá trình thoát.

Khi mã được thực thi dưới dạng tập lệnh nút độc lập, câu lệnh nhật ký được in, nhưng quá trình này chỉ bị treo.

Khi tôi cố gỡ lỗi và tôi bắt đầu chương trình bằng cách sử dụng --debug-brk và sử dụng node-inspector, nó sẽ thoát sớm! Tôi thấy rằng process.on 'exit' được gọi. Nó thoát ra trong khi một số callback nội bộ bên trong module vẫn chưa được gọi. Vì vậy, các báo cáo đăng nhập ở trên không được in hoặc.

Tôi bị kẹt ngay bây giờ và không chắc chắn tại sao điều này xảy ra. Có ai nhìn thấy hành vi tương tự không?

Trả lời

11

Khi bạn chạy tập lệnh dưới dạng tập lệnh và nó treo khi "hoàn thành", điều đó có nghĩa là nút vẫn có đăng ký cuộc gọi lại đang chờ sự kiện. Node không biết rằng những sự kiện đó sẽ không cháy nữa. Bạn có thể chỉ cần gọi process.exit() nếu bạn biết đã đến lúc thoát hoặc bạn có thể đóng/hủy liên kết/ngắt kết nối tất cả mọi thứ một cách rõ ràng (kết nối mạng, kết nối db, v.v.). Nếu bạn đóng tất cả mọi thứ đúng cách, nút sẽ thoát.

Mô-đun wtfnode (được đề cập bởi Nathan Arthur) hoặc why-is-node-running có thể thực sự hữu ích khi theo dõi việc này.

+5

Có cách nào khác để tìm hiểu điều gì đang giữ nút mở? – Aishwar

+4

Nếu bạn có trình kiểm tra nút và có thể đính kèm vào quy trình và thiết lập một điểm ngắt trong mã vòng lặp sự kiện của nút, có thể. Tôi đã không bao giờ thành công theo dõi một trong những xuống. Đó là một trong hai điều rõ ràng như mở một kết nối DB nhưng không bao giờ rõ ràng đóng nó, hoặc tôi chỉ làm 'process.exit()' và tiếp tục cuộc sống của tôi. –

+6

process._getActiveHandles() và process._getActiveRequests() xem http://stackoverflow.com/questions/17960452/how-can-i-get-a-list-of-callbacks-in-the-node-work-queue -hoặc-why-wont-nút-ex – aaron

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