2014-05-13 24 views
14

Làm thế nào để xử lý lỗi etimedout trên cuộc gọi này?Làm thế nào để xử lý lỗi ETIMEDOUT?

var remotePath = "myremoteurltocopy" 
var localStream = fs.createWriteStream("myfil");; 
     var out = request({ uri: remotePath }); 
     out.on('response', function (resp) { 
      if (resp.statusCode === 200) { 
       out.pipe(localStream); 
       localStream.on('close', function() { 
        copyconcurenceacces--; 
        console.log('aftercopy'); 
        callback(null, localFile); 
       }); 
      } 
      else 
       callback(new Error("No file found at given url."), null); 
     }) 

Có cách nào để chờ lâu hơn? hoặc yêu cầu lại tập tin từ xa?

Chính xác những gì có thể gây ra lỗi này? Chỉ hết thời gian chờ?

Trả lời

21

Điều này xảy ra khi không nhận được phản hồi yêu cầu của bạn trong thời gian đã cho (tùy chọn timeout yêu cầu mô-đun).

Về cơ bản để bắt lỗi đó trước tiên, bạn cần phải đăng ký trình xử lý theo số error, do đó, lỗi không được xử lý sẽ không bị ném nữa: out.on('error', function (err) { /* handle errors here */ }). Một số giải thích khác here.

Trong trình xử lý, bạn có thể kiểm tra xem lỗi có phải là ETIMEDOUT không và áp dụng logic của riêng bạn: if (err.message.code === 'ETIMEDOUT') { /* apply logic */ }.

Nếu bạn muốn yêu cầu lại tệp, tôi khuyên bạn nên sử dụng mô-đun node-retry hoặc node-backoff. Nó làm cho mọi thứ trở nên đơn giản hơn nhiều.

Nếu bạn muốn chờ lâu hơn, bạn có thể đặt timeout option of request yourself. Bạn có thể đặt giá trị 0 thành không có thời gian chờ.

+1

Tôi tin rằng các lỗi lõi nút này có một '.code' hoặc thuộc tính tương tự có chứa 'etimedout' hoặc tương tự mà bạn có thể kiểm tra thay vì phải thực hiện' err.message.match() '. – mscdex

+0

Tôi chắc chắn họ làm, tôi đã nhìn thấy nó. Nhưng không nhớ tài sản nào –

+0

Xin chào. Cảm ơn bạn đã giúp đỡ. Bạn có thể cho tôi một số liên kết để xử lý lỗi hiểu rõ hơn và nắm bắt được trong các nodej không? Tôi có một etimdout sau vài giây. – mcbjam

0

Chúng tôi có thể xem đối tượng lỗi cho thuộc tính code đề cập đến lỗi hệ thống có thể xảy ra và trong trường hợp ETIMEDOUT nơi cuộc gọi mạng không thành công, hãy hành động tương ứng.

if (err.code === 'ETIMEDOUT') { 
    console.log('My dish error: ', util.inspect(err, { showHidden: true, depth: 2 })); 
} 
+1

Tốt nhất là bạn nên thêm một số bình luận chứ không phải chỉ cần tung mã ra khỏi đó. –

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