Vì vậy, sự hiểu biết của tôi là lệnh tạm dừng có nhiệm vụ dừng các yêu cầu trong bộ lọc hiện tại, nhưng nó dường như vẫn tiếp tục. Dưới đây là một ứng dụng Sinatra rất đơn giản thể hiện điều này.
máy chủ.rb
yêu cầu 'sinatra'
trước khi làm
đặt "trước khi dừng"
tạm dừng 401
đặt "sau khi tạm dừng"
end
trước '/partners*' làm
đặt "tôi ở trước /đối tác"
end
sau '/partners*' làm
đặt "tôi theo sau /đối tác"
end
nhận '/partners/v1/:public_id' làm
đặt "tôi đang đi trên tuyến đường thực tế"
end
Tôi gọi "get" tại:localhost:4567/đối tác/v1/111
Tôi mong đợi đầu ra:
trước khi dừng lại
Đầu ra thực sự là gì:
trước khi dừng lại
tôi đang theo dõi/đối tác
所以我的问题是:
1. Tại sao điểm dừng vẫn tiếp tục (hiển thị là điểm đến sau '/đối tác*'
)
2. Tại sao nó lại trúngsau '/đối tác*'
thay vìtrước '/đối tác*'
Đây là mã cho dừng lại
Và đây là mã cho gọi
, trong khi ở gọi
Dưới đây là khai báo phương thức cho gửi đi!
如您所见,gửi đi!
gọi gọi
, chạy với sự hỗ trợ cho dừng lại
khối định tuyến của ing. nó vẫn ở đó gọi
Chạy theo khối :trước
lọc.
gọi làm
tĩnh! nếu settings.static? && (request.get? || request.head?)
lọc! :trước
tuyến đường!
Vì vậy, bạn có thể trước
bộ lọc bên trong暂停
, nó sẽ không đến được tuyến đường, đó là lý do tại sao bạn không thấy bất kỳ đầu ra nào từ khối tuyến đường.
Nhưng,gửi đi!
Có một phương pháp khácđảm bảo
:
đảm bảo
begin
lọc! :after trừ khi env['sinatra.static_file']
确保
Hãy làm những gì nó nói,nó sẽ luôn được đánh giá. Đây là thỏa thuận sau '/đối tác*'
Nguyên nhân bị chặn. Đây là hành vi được mong đợi (vì nó được mã hóa rõ ràng theo cách này). Về cơ bản, nếu bạn đặt after
block , nó sẽ được xử lý bất kể trước
trong bộ lọc hoặc khối định tuyến dừng lại
S.
Từ tài liệu:
Các tuyến đường được khớp theo thứ tự chúng được xác định. Tuyến đường đầu tiên phù hợp với yêu cầu sẽ được gọi.
and
…bộ lọc được đánh giá trước mỗi yêu cầu trong cùng bối cảnh với các tuyến đường
Bây giờ, các tài liệu không nêu rõ điều này, nhưng nếu bạn đặt hai dấu ngoặc kép lại với nhau, tôi sẽ cho rằng nó có nghĩa là "Các bộ lọc khớp với thứ tự chúng được xác định." Về cơ bản, vì nó khớp với hành vi thực tế.
tất cả trước
tất cả các bộ lọc đều sẽ chạy, nhưng bạn đặt dừng lại
, vì vậy bộ lọc thứ hai (trước '/đối tác*'
) không chạy.
Tôi là một lập trình viên xuất sắc, rất giỏi!