Tài liệu này được dịch bởi AI. Đối với bất kỳ thông tin không chính xác nào, vui lòng tham khảo phiên bản tiếng Anh
Middleware của NocoBase Server về cơ bản là Koa middleware. Bạn có thể thao tác đối tượng ctx để xử lý yêu cầu và phản hồi giống như trong Koa. Tuy nhiên, vì NocoBase cần quản lý logic ở nhiều tầng nghiệp vụ khác nhau, nếu tất cả middleware được đặt chung, việc bảo trì và quản lý sẽ rất phức tạp.
Để giải quyết vấn đề này, NocoBase chia middleware thành bốn tầng:
Middleware cấp nguồn dữ liệu: app.dataSourceManager.use()
Chỉ áp dụng cho các yêu cầu của một nguồn dữ liệu cụ thể, thường được sử dụng cho các logic như kết nối cơ sở dữ liệu, xác thực trường hoặc xử lý giao dịch của nguồn dữ liệu đó.
Middleware cấp tài nguyên: app.resourceManager.use()
Chỉ áp dụng cho các tài nguyên (Resource) đã được định nghĩa, phù hợp để xử lý logic ở cấp tài nguyên, như quyền truy cập dữ liệu, định dạng, v.v.
Middleware cấp quyền: app.acl.use()
Được thực thi trước khi kiểm tra quyền, được sử dụng để xác minh quyền hoặc vai trò của người dùng.
Middleware cấp ứng dụng: app.use()
Được thực thi cho mọi yêu cầu, phù hợp cho các tác vụ như ghi nhật ký, xử lý lỗi chung, xử lý phản hồi, v.v.
Middleware thường được đăng ký trong phương thức load của plugin, ví dụ:
Thứ tự thực thi middleware như sau:
acl.use() thêm vàoresourceManager.use() thêm vàodataSourceManager.use() thêm vàoapp.use() thêm vàoĐể kiểm soát thứ tự middleware linh hoạt hơn, NocoBase cung cấp các tham số before, after và tag:
Ví dụ:
Nếu không chỉ định vị trí, thứ tự thực thi mặc định cho middleware mới được thêm vào là:
acl.use() -> resourceManager.use() -> dataSourceManager.use() -> app.use()
Thứ tự thực thi middleware tuân theo mô hình Onion của Koa, tức là vào stack middleware trước và thoát ra sau cùng.
Ví dụ về thứ tự xuất ra khi truy cập các API khác nhau:
Yêu cầu thông thường: /api/hello
Đầu ra: [1,2] (tài nguyên không được định nghĩa, không thực thi middleware resourceManager và acl)
Yêu cầu tài nguyên: /api/test:list
Đầu ra: [5,3,7,1,2,8,4,6]
Middleware thực thi theo thứ tự tầng và mô hình Onion.
before / after / tag để kiểm soát linh hoạt thứ tự thực thi.