2015-10-28 20 views
5

Tôi đang mã hóa trang web đấu giá trong Laravel 5.0 mô phỏng các bản cập nhật thời gian thực bằng cách sử dụng một con trỏ AJAX được thực thi sau mỗi 5 giây. Vấn đề là máy chủ của tôi trả về trạng thái HTTP 401 không thường xuyên.Lỗi Laravel và AJAX lẻ tẻ 401 trong một poller

tuyến đường của tôi là xây dựng như thế này:

Route::post(auction/live/update, '[email protected]'); 

điều khiển của tôi là như thế này:

public function ajaxSendUpdate() { 
    // Business logic: queries database, couple of Ifs, etc… 
    $data = array('success' => true, 'otherStuff' => $myData); 
    return Response::json($data); 
} 

Cuối cùng poller của tôi được thiết lập như thế này:

// a bit of HTML 
function getAuctionUpdate() { 
    setTimeout(function() { 
    $.ajax({ 
     type: "POST", 
     url: "{!! url('auction/live/update')!!}", 
      dataType: 'json', 
      data: { 
       auctionID: $('#auctionID').val() 
      }, 
      success: function (data) { 
       if (data['success']) { 
        // Updates some labels, etc. 
        getAuctionUpdate(); // Rearms itself 
       } 
      } 
    } }); // Not sure if all brackets are correct in this snippet but they are 100% on real code 
}, 5000); 

Mã này chạy tốt khoảng 95% số lần. Tuy nhiên nó có thể phá vỡ với 2 kết quả khác nhau:

1) Máy chủ trả lời lỗi 401 sau một thời gian và không bao giờ phục hồi. Trong trường hợp này, chúng ta cần đăng nhập lại. Sau khi đăng nhập, mọi thứ diễn ra tốt đẹp và kết quả này không bao giờ xảy ra nữa.

2) Máy chủ phản hồi với số lượng không thường xuyên 401 nhưng khôi phục trong yêu cầu thăm dò tiếp theo (hoặc sau một vài).

Tôi đang sử dụng Laravel 5.0 và phiên bản cập nhật của Xampp trên Windows. Lỗi này dễ dàng được sao chép bằng WAMP trên Windows. Không được thử nghiệm trong Linux cũng như OSX. Tôi đã đọc thisthis và các loại chủ đề trong laracasts.com và các diễn đàn khác nhưng tôi không thể giải quyết vấn đề ...

+0

Bạn có lỗi cú pháp. url: "{!!url ('đấu giá/sống/cập nhật') !!} ", – kotapeter

+0

Bạn đã đúng nhưng đó là vấn đề với việc dán bản sao (tôi cũng đã dịch mã từ ngôn ngữ mẹ đẻ sang tiếng Anh để dễ đọc hơn). tốt ... –

+0

Có điều này là tốt, không chắc chắn nếu lỗi sao chép như đã nêu ở trên: 'auctionID: $ ('# auctionID) .val()' không gian sau '#' và thiếu đóng ''' sau 'auctionID'. –

Trả lời

1

Sau nhiều giờ kiểm tra, tôi tin rằng tôi đã giải quyết được vấn đề này ngay cả khi tôi không hiểu đầy đủ làm thế nào và thậm chí nếu đây là một câu trả lời phổ quát có thể được áp dụng cho các trường hợp tương tự.

Phát triển sớm Tôi đã vô hiệu hóa phần mềm trung gian VerifyCsrfToken trong kernel.php vì vậy tôi không gửi bất kỳ _token nào với các yêu cầu AJAX của mình. Bật phần mềm trung gian VerifyCsrfToken và gửi _token ngay lập tức khiến tất cả các lỗi HTTP 401 biến mất. Bây giờ, tôi bắt đầu gặp một vấn đề khác: thậm chí nhiều lỗi HTTP 500 không thường xuyên hơn. Xem nhanh nhật ký cho thấy tất cả các lỗi HTTP 500 là do TokenMismatchException gây ra.

Sau đó, tôi đã xem qua this. Theo các hướng dẫn trang web tôi đặt này trong phần đầu master.page tôi:

<meta name="csrf-token" content="{{ csrf_token() }}"> 

Và điều này trong javascript master.page tôi:

$.ajaxSetup({ 
    headers: { 
     'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 
    } 
}); 

Và bằng cách nào đó mọi thứ đều tốt bây giờ. Vì vậy, đối với tất cả ý định và mục đích, vấn đề ban đầu của tôi được giải quyết nhưng tôi vẫn không thể hiểu được:

1 - Tại sao tôi nhận được lỗi HTTP 401 lẻ tẻ khi tôi không gửi bất kỳ yêu cầu AJAX nào nếu tôi đã tắt phần mềm trung gian VerifyCsrfToken trong kernel.php?

2 - Tại sao tôi bắt đầu nhận được TokenMismatchException rời rạc khi tôi bật phần mềm trung gian VerifyCsrfToken trong kernel.php nếu tôi bắt đầu gửi _token với các yêu cầu AJAX của mình?

3 - Tại sao X-CSRF-TOKEN cuối cùng đã giải quyết được vấn đề lỗi HTTP 500? Lưu ý rằng tất cả các lỗi đều không thường xuyên và không vĩnh viễn: Tôi sẽ có nguy cơ nói rằng 95 đến 98% tất cả các yêu cầu AJAX đều ổn, chỉ một số ít trong số đó có bất kỳ vấn đề gì.

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