You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中如何等待事件?BPMN工作流分步执行需求咨询

解决BPMN工作流分步执行事件的问题

结合你使用的bpmn-engine和json-server,以及当前单次POST请求只能触发一次事件的现状,我给你几个可行的调整方案:

1. 给json-server中间件添加状态跟踪逻辑

json-server本身是无状态的REST服务,要实现分步执行,首先得让中间件能记住当前执行到哪一步。你可以在中间件脚本里用内存变量或者持久化存储来跟踪步骤:

示例:内存状态跟踪(script1.js)

// 用内存变量记录当前步骤,重启服务会重置
let currentWorkflowStep = 0;

module.exports = (req, res, next) => {
  // 只处理POST请求的工作流触发
  if (req.method !== 'POST') return next();

  switch(currentWorkflowStep) {
    case 0:
      // 执行第一个事件的逻辑(对应script1的原有代码)
      console.log('执行事件1:处理POST数据');
      // 返回下一步信息给客户端
      res.json({ status: 'event1_completed', nextStep: 1 });
      currentWorkflowStep++;
      break;
    case 1:
      // 执行第二个事件的逻辑(对应script2的原有代码)
      console.log('执行事件2:完成后续处理');
      res.json({ status: 'event2_completed', workflowDone: true });
      // 重置步骤,方便下一次工作流触发
      currentWorkflowStep = 0;
      break;
    default:
      res.status(400).json({ error: '无更多待执行事件' });
  }
};

这样每次POST请求都会触发当前步骤的事件,自动推进到下一步。

2. 让bpmn-engine主导流程驱动

不要把所有事件逻辑都塞在json-server中间件里,应该让bpmn-engine来控制流程的流转,json-server只作为事件执行的服务节点:

示例:用bpmn-engine调用json-server接口

const { BpmnEngine } = require('bpmn-engine');
const axios = require('axios');

// 初始化BPMN引擎
const engine = new BpmnEngine({
  source: './your-workflow.bpmn', // 你的BPMN流程文件
});

// 监听服务任务事件,调用对应的json-server接口
engine.on('serviceTask', async ({ element }) => {
  const taskId = element.id;
  try {
    if (taskId === 'eventTask1') {
      // 调用对应事件1的接口
      await axios.post('http://localhost:3000/trigger-event', { task: 'event1' });
    } else if (taskId === 'eventTask2') {
      // 调用对应事件2的接口
      await axios.post('http://localhost:3000/trigger-event', { task: 'event2' });
    }
  } catch (err) {
    console.error(`执行任务${taskId}失败:`, err);
    throw err;
  }
});

// 启动BPMN流程
engine.start().catch(err => console.error('流程启动失败:', err));

同时调整json-server的中间件,根据请求体里的task参数执行对应脚本:

// script1.js(合并script2的逻辑)
module.exports = (req, res, next) => {
  if (req.method !== 'POST') return next();

  const { task } = req.body;
  if (task === 'event1') {
    // 原script1的逻辑
    res.json({ success: true });
  } else if (task === 'event2') {
    // 原script2的逻辑
    res.json({ success: true });
  } else {
    res.status(400).json({ error: '未知任务类型' });
  }
};

这种方式更贴合BPMN工作流的设计理念,由引擎来管理流程的状态和流转。

3. 持久化工作流状态(可选)

如果需要服务重启后不丢失当前步骤,可以把状态存在db.json里,用lowdb(json-server依赖的库)来读写:

const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');

const adapter = new FileSync('db.json');
const db = low(adapter);

// 初始化状态(如果db.json里没有)
db.defaults({ workflowState: { currentStep: 0 } }).write();

module.exports = (req, res, next) => {
  if (req.method !== 'POST') return next();

  const currentStep = db.get('workflowState.currentStep').value();
  switch(currentStep) {
    case 0:
      // 执行事件1
      db.set('workflowState.currentStep', 1).write();
      res.json({ status: 'event1_done', nextStep: 1 });
      break;
    case 1:
      // 执行事件2
      db.set('workflowState.currentStep', 0).write();
      res.json({ status: 'workflow_completed' });
      break;
  }
};

内容的提问来源于stack exchange,提问作者Ondescone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:51:59