Giao diện
Câu hỏi thường gặp (FAQ) — Workflow
Sử dụng
Workflow chạy không đúng?
Kiểm tra theo thứ tự:
- Execution logs: Vào workflow → Executions → xem execution gần nhất
- Job status: Kiểm tra từng job — job nào
rejectedlà nơi có lỗi - Trigger condition: Xác nhận trigger đúng event và collection
- Node config: Kiểm tra cấu hình từng node (field mapping, condition expression)
- Log file: Xem
logs/workflows/{workflowId}/để biết chi tiết lỗi
Có giới hạn số workflow không?
Không có giới hạn kỹ thuật. Tuy nhiên, nhiều workflow enabled cùng lúc sẽ:
- Tăng số event listener trên database
- Tăng tải cho Dispatcher
- Tốn nhiều memory cho enabled cache
Khuyến nghị: chỉ enable workflow cần thiết, disable workflow không dùng.
Workflow không kích hoạt?
Kiểm tra:
- Enabled? Workflow phải có
enabled: true - Trigger type đã đăng ký? Kiểm tra log:
trigger type {type} is not implemented - Event đúng? Collection Event trigger cần đúng collection và event type
- Dữ liệu match? Trigger có thể có filter condition — kiểm tra dữ liệu có thỏa mãn không
Workflow chạy bị lặp vô hạn?
Nguyên nhân phổ biến:
- Node Update cập nhật cùng collection mà trigger đang lắng nghe → trigger lại workflow
- Giải pháp: thêm Condition node kiểm tra trạng thái trước khi update, hoặc dùng field flag để tránh re-trigger
User nhận task thế nào?
Khi workflow tạo task cho user:
- Task được lưu vào
workflowTasks+userWorkflowTasks - Plugin gửi thông báo qua WebSocket:
ws:sendToUser - User xem task tại My Tasks → chọn Resume hoặc Cancel
Cấu hình
Làm sao thêm trigger type mới?
typescript
class MyPlugin extends Plugin {
async load() {
const wf = this.app.pm.get('workflow') as PluginWorkflowServer;
wf.registerTrigger('webhook', WebhookTrigger);
}
}WebhookTrigger cần kế thừa class Trigger và implement các method on(), off().
Làm sao thêm instruction (node type) mới?
typescript
wf.registerInstruction('send-email', SendEmailInstruction);SendEmailInstruction cần kế thừa class Instruction và implement method run().
Custom function là gì?
Function có thể dùng trong Calculation node:
javascript
// Dùng function genSnowflakeId đã đăng ký
return $functions.genSnowflakeId();Plugin khác đăng ký:
typescript
wf.functions.register('myFunction', () => {
return 'custom value';
});Workflow versioning
Tại sao có key và current?
Plugin hỗ trợ versioning: nhiều phiên bản workflow cùng key, nhưng chỉ 1 phiên bản có current: true.
- Khi enable workflow → đặt
current: true - Phiên bản trước bị
enabled: false,current: null - Execution logs giữ nguyên — bạn xem được lịch sử chạy của mỗi phiên bản
Tại sao cần workflowStats và versionStats?
| Stats | Phạm vi | Mô tả |
|---|---|---|
workflowStats | Toàn bộ workflow (cùng key) | Đếm tổng số lần thực thi qua tất cả phiên bản |
versionStats | Phiên bản cụ thể | Đếm số lần thực thi của phiên bản hiện tại |
Xử lý sự cố
Lỗi "trigger type is not implemented"?
Workflow có type không khớp với trigger đã đăng ký. Nguyên nhân:
- Plugin cung cấp trigger chưa được bật
- Workflow được import từ nơi khác với trigger type không tồn tại
Execution stuck ở trạng thái "started"?
Nguyên nhân:
- Node bị lỗi không bắt được (unhandled error)
- Node manual đang chờ user duyệt nhưng user chưa thao tác
- Dispatcher bị overload
Giải pháp:
- Cancel execution thủ công
- Kiểm tra log file để xem node nào bị stuck
- Dispatcher kiểm tra queue mỗi 5 phút — chờ hoặc trigger manual:
app.emit('workflow:dispatch')
Restart server có ảnh hưởng workflow đang chạy?
Khi restart:
beforeStophook tắt tất cả trigger và dọn dẹp- Sau khi khởi động lại,
afterStarthook load lại tất cả workflow enabled - Dispatcher kiểm tra queue và tiếp tục execution đang chờ
Execution đang chạy giữa chừng sẽ được Dispatcher phát hiện và tiếp tục sau khi server sẵn sàng.