2015-01-23 19 views
5

Đó là một quy ước trong nút để vượt qua một tham số lỗi để hoạt động không đồng bộ:Kiểm tra thông số lỗi trong nút

async.someMagicalDust(function(callback) { 
    // some asynchronous task 

    // […] 
    callback(); 

}, function(err) { 
    // final callback 

    if(err) throw err;  
    // […] 

}); 

Có lẽ tôi quá ngây thơ, nhưng tôi chưa bao giờ là một fan hâm mộ lớn của if(variable) ký hiệu - có thể được kế thừa từ C, vì lý do mà have already been discussed many times in the past.

Mặt khác, tôi đã đôi khi gặp phải một tham số null và kiểm tra lỗi này:

if(typeof err !== 'undefined' && err !== null) 

là một chút quá dài dòng.

giải pháp sẽ được

if(err != null) 

nhưng tôi nghĩ non-strict check thể được khôn lanh, mặc dù tôi xem xét nó bình thường khi so sánh với null.

Cách tốt nhất để kiểm tra thông số lỗi trong nút là gì?

Trả lời

2

Sử dụng if(err).

Nó được thiết kế để sử dụng theo cách này. Các callback kiểu nút có nghĩa vụ phải đặt lỗi thành một giá trị không có giá trị chỉ trong trường hợp lỗi thực tế. Bạn sẽ không tìm thấy bất kỳ ví dụ lành mạnh nào về việc thiết lập err thành '' hoặc 0 để biểu thị lỗi.

Cũng giống như YlinaGreed đã lưu ý, nếu ước mô-đun cnahge từ null để undefined-0 để thậm chí có thể NaN, bạn vẫn an toàn. Tôi chưa bao giờ bị ảnh hưởng bởi điều này chỉ sử dụng if(err).

Mặt khác, bạn có thể muốn sử dụng coffescript, mà sẽ dịch cho bạn

unless err? then... 

vào

if (typeof err === "undefined" || err === null) { 

bắt chước mô hình phổ biến nhất.

Một số liên kết để chứng thực phương pháp if(err):

Quy ước dường như được đi qua một lỗi đối tượng là đối số đầu tiên và null không có lỗi nào nếu bạn vượt qua một đối tượng trống, nó vẫn là một lỗi.

Nếu bạn sử dụng khung phổ biến express, bạn nên sử dụng gọi lại next để quay lại từ phần mềm trung gian, tuân theo quy ước errback.

Tôi tin rằng hầu hết mọi người thích ngắn gọn hơn next() hơn next(null), có nghĩa là đối số đầu tiên sẽ đánh giá để undefined hơn null, và điều này chắc chắn là sử dụng hoàn toàn bình thường.

+0

Tuy nhiên, bạn có thể giới thiệu ví dụ thứ hai về err == null (bình đẳng không nghiêm ngặt, mang cùng kết quả) –

+0

Tôi sẽ giới thiệu nó chỉ khi nó được tạo tự động (ví dụ: bằng coffeescript). Nếu không, độ rõ ràng của mã sẽ vượt quá những cân nhắc khác. – punund

+0

Tôi nghĩ đây là phương pháp phù hợp. Bạn có thể tìm thấy nguồn chính thức/tham chiếu cho "nó được thiết kế để được sử dụng trong thời trang này"? –

0

Đối với tôi, cách tốt nhất để xử lý lỗi là "if (err == null)" Đây là trường hợp duy nhất mà tôi đang sử dụng các nhà điều hành không nghiêm ngặt, vì những lý do:

  • duy nhất qua giải pháp luôn hoạt động rất chi tiết, như bạn đã nói trước đây
  • Bạn cũng có thể chỉ chọn "null" hoặc "chưa xác định", nhưng tôi đã làm điều này một lần và một vài tháng sau, tôi vừa cập nhật các phụ thuộc của mình và .. Quy ước đã thay đổi và mô-đun đã gửi null thay vì không xác định.

Đây chủ yếu là vấn đề của "quy ước", tôi có của tôi, và bạn chắc chắn cũng có của bạn ... Chỉ cần cẩn thận chọn một trong hai cách "tốt".

0

Quy ước gọi lại chính của nút là chuyển một hàm với thông số đầu tiên là err. Theo kinh nghiệm của tôi, nó luôn được an toàn để kiểm tra xem lỗi có đúng hay không - trong thực tế nếu lỗi của bạn xuất hiện vô giá trị khi có lỗi thì vấn đề nằm nhiều hơn với việc triển khai. Tôi sẽ luôn luôn mong đợi nếu err là null mà không có lỗi xảy ra. Nó có thể gây nhầm lẫn do việc sử dụng các hàm riêng biệt cho các lỗi và thành công, một cái gì đó có nhiều hơn trong phong cách của JQuery.Ajax và các lời hứa. Tôi có xu hướng tìm thấy các callbacks kép để có một chút quá dài để gọi.

Cho ví dụ của bạn có vẻ như bạn đang sử dụng thư viện async tuyệt vời. Nếu tôi đang tìm cách thực hiện tùy chọn song song, đây là cách tôi thiết lập tùy chọn này:

function doAThing(callback) { 
    var err; 

    // do stuff here, maybe fill the err var 

    callback(err); 
} 

function doAsyncThings(callback) { 
    var tasks = [function(done) { // stuff to do in async 
    doAThing(function(err) { 
     done(err); 
    }); 
    }]; 

    async.parallel(tasks, function(err) { // single callback function 
     callback(err); // I send the error back up 
    }); 
} 

Lưu ý rằng thay vì ném lỗi, tôi đã làm sôi động nó sao lưu chuỗi yêu cầu. Có vài trường hợp mà tôi muốn thực sự ném một lỗi vì bạn về cơ bản nói "sụp đổ toàn bộ ứng dụng".

Tôi thấy nó đơn giản hơn và giảm lượng thông số bạn phải sử dụng để gọi các chức năng của mình. Khi bạn sử dụng Công ước này trong suốt bạn, bạn có thể đơn giản hóa bằng cách đơn giản thông qua gọi lại như một tham số thay vì tạo ra một chức năng ẩn danh mới, như vậy:

function doAThing(callback) { 
    var err; 

    // do stuff here, maybe fill the err var 

    callback(err); 
} 

function doAsyncThings(callback) { 
    var tasks = [function(done) { // stuff to do in async 
    doAThing(done); 
    }]; 

    async.parallel(tasks, callback); // the error is sent back to the original function 
} 

Tôi thấy rằng nhìn chung bạn muốn xử lý những sai sót trong các chức năng họ Vì vậy, trong trường hợp này, người gọi doAsyncThings có thể kiểm tra xem có lỗi hay không và xử lý nó phù hợp với phạm vi của chính nó (và có thể cung cấp thông tin tốt hơn cho người dùng nếu nó là một API).

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