2013-08-15 61 views
10

Tôi đang gặp phải một hành vi lạ với instanceof trong NodeJs. Tôi đang cố gắng để tạo ra một mô-đun mà ném ngoại lệ mà có thể bị bắt bởi tiêu thụ các mô-đun và xử lý dựa trên loại ngoại lệ. Tuy nhiên, cuộc gọi để kiểm tra loại "trường hợp lỗi của mod.MyException" luôn trả về false.Nodejs + Yêu cầu instanceof behavior

mymodule.js:

function MyException() {} 
MyException.prototype = new Error(); 
MyException.prototype.constructor = MyException; 

function Foo() { 
    throw new MyException(); 
} 

exports.Foo = Foo; 
exports.MyException = MyException; 

myconsumingmodule.js

var mod = require('mymodule'); 

try { 
    mod.Foo(); 
} catch (error) { 
    if (error instanceof mod.MyException) { // always returns false 
     //do error specific handling (never executes) 
     return; 
    } 
    // generic handling 
} 

Nếu tôi làm bài kiểm tra instanceof trong mymodule.js như vậy nó trả về true

mymodule .js

var a = new MyException() 
console.log(a instanceof MyException); //true 

Tuy nhiên nếu tôi tạo ngoại lệ trong mô-đun tiêu thụ và kiểm tra nó xác định chính xác nó là MyException, nó không chỉ khi so sánh nó với ngoại lệ được tạo bởi mô-đun kia.

myconsumingmodule.js

var mod = require('mymodule') 
var b = new mod.MyException(); 
console.log(b instanceof mod.MyException); // true 
+0

hoạt động cho tôi trên nút 0.10.5 – soulcheck

+0

@Eriedor, bạn đã bao giờ tìm thấy giải pháp cho vấn đề này chưa? – jayarjo

+0

Tôi e rằng tôi không có, tôi đã từ bỏ cố gắng giải quyết vấn đề này và không xem lại nó để xem nó có được sửa trong phiên bản sau của nút hay không. – Eriedor

Trả lời

0

Không thể tạo lại vấn đề. Làm việc cho tôi bằng cách sử dụng phiên bản 0.12 và 4.0.0 (thử nghiệm cả hai).

Điều bạn nên xem xét trong tương lai là bạn tham khảo các mô-đun OWN của mình bằng các đường dẫn tương đối (các đường dẫn tuyệt đối không độc lập với hệ thống). Nếu không, bạn thường tham chiếu các mô-đun lõi của Node.js trực tiếp hoặc NPM được cài đặt. Vì vậy, thay đổi 'mymodule' thành './mymodule' (thay đổi đường dẫn tương ứng).

6

FOUND CNTT

Để sử dụng ví dụ của bạn, trong tập tin one.js tôi đã:

var mod = require('mymodule'); 

nhưng trong khác tập tin two.js tôi đã:

var mod = require('Mymodule'); 

và mọi thứ dường như làm việc chính xác như nhau, trừ khi bạn so sánh lỗi được tạo từ one.js sử dụng instanceof trong two.js!.

ngớ ngẩn, Node.js cho phép bạn làm một case-insensitive yêu cầu, ngoại trừ nó không thực sự case-insensitive, nó thực sự đòi hỏi tập tin của bạn hai lần, đó là lý do instanceof lợi nhuận false - các nhà thầu là hai chức năng khác nhau từ hai trường hợp mô-đun khác nhau!

TL; DR

Đảm bảo tất cả require dây của bạn là trường phù hợp.

+1

Tôi muốn tôi có thể cung cấp cho nhiều hơn một phiếu bầu. Sau nhiều giờ nghiên cứu này (mà kết thúc với hầu hết mọi người trả lời một số câu hỏi khác) Tôi đã chỉ về từ bỏ. Trong một tập tin tôi đã có trường hợp sai. Thay đổi nó và Thì đấy! Tôi đặt cược bạn đang trên một máy Mac (như tôi) trong đó có trường hợp bảo tồn, trường hợp bỏ qua ngữ nghĩa hệ thống tập tin. Tôi không nghĩ đây là lỗi của NodeJS. Vui lòng đánh dấu đây là câu trả lời. –

+1

Một điều đáng nhắc đến (bởi vì tôi chỉ chạy vào nó) là các đường dẫn khác nhau đến tệp cũng sẽ có hiệu ứng này. Vì vậy, tham chiếu 'a/b/c.js' tham chiếu' ../../ d.js' và 'a/b.js' tham chiếu' ../ d.js' sẽ yêu cầu 'd.js' hai lần ... –

+0

Rất hữu ích - đã giải quyết vấn đề tương tự, khó chẩn đoán của tôi. Cảm ơn bạn. Giống như James Keesey, tôi đang ở trên máy Mac. –

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