Yêu cầu thg 10 24, 2020 10:10 SA 228 0 1
  • 228 0 1
0

Laravel API và setInterval AJAX

Chia sẻ
  • 228 0 1

Mình đang vướng 1 vấn đề khi dùng ajax gọi PUT/POST đến api Laravel nhiều lần theo thời gian cài đặt.

Laravel 8.x jQuery > 3.x

Route API:

Route::put('/topic/savechange', 'TopicController@saveChange')->name('topic.savechange');

Setup Throttle mạc định 60 request trong 1 phút

/**
 * Configure the rate limiters for the application.
 *
 * @return void
 */
protected function configureRateLimiting()
{
    RateLimiter::for('api', function (Request $request) {
        return Limit::perMinute(60);
    });
}

Global JS, lấy csrf-token từ meta đã có phía trên cùng head

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

Xử lý JS autosave mỗi 3s

var saveDone = function() {
    $.ajax({
        url: "savechange",
        method: "PUT",
        data: {
            id: 123332423,
        },
    });
}

setInterval(() => {
     saveDone();
}, 3000);

Nếu mình bấm bằng buttton rồi gọi đến saveDone thì rất bình thường với Throttle 60rq/1min, nhưng để tự động thì từ request thứ 2 trở đi bên phía API sẽ báo csrf token mismatch

Nghiên cứu cả ngày chưa ra, mọi người giúp mình với ạ 😇

1 CÂU TRẢ LỜI


Đã trả lời thg 10 25, 2020 6:22 SA
Đã được chấp nhận
0

Em đoán do lần đầu $.ajaxSetup() được gọi do khi load trang. Từ lần thứ 2 nó không bắt được event load trang nên không gọi vào hàm này nữa dẫn đến lỗi csrf token mismatch 😜😜

Bác thử xử lí theo kiểu set cái token vào data khi call ajax xem sao

    $.ajax({
        url: "savechange",
        method: "PUT",
        data: {
            id: 123332423,
            "_token": $('meta[name="csrf-token"]').attr('content')
        },
    });
Chia sẻ
Avatar John Melby @john_melby
thg 10 25, 2020 11:24 SA

thêm cái header đỡ ảnh hưởng data hơn

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

khả năng cao là cái ajax bị init lại khi gọi setInterval nên mất hết settings 😆

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí