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

Atlassian Confluence Forge异步事件队列payload/context为undefined求助

Forge队列消费者接收payload/context为undefined的问题排查与解决

此前按官方文档实现的Forge队列功能正常,近期突然出现消费者接收的eventPayload和eventContext均为undefined的情况,已通过全新极简应用复现该问题。

极简复现代码

manifest.yml

modules:
  macro:
    - key: queue-test-hello-world
      function: main
      title: queue-test
      description: Inserts Hello world!
  trigger:
    - key: dl-spike-one-trigger-pageviewed
      function: dl-trigger-pageviewed
      events:
        - avi:confluence:viewed:page
  function:
    - key: main
      handler: index.run
    - key: dl-trigger-pageviewed
      handler: index.dl_handleTriggerPageViewed
    - key: test-listen
      handler: index.testQueueHandler
  consumer:
    - key: test-consumer
      queue: test-updates
      resolver:
        function: test-listen
        method: test-event-listener
app:
  id: ari:cloud:ecosystem::app/c78946b8-55bf-4c2b-94fe-79dc9e1de33f
permissions:
  scopes:
    - read:confluence-content.summary
    - read:confluence-content.all
    - read:page:confluence
    - storage:app
    - read:space:confluence
    - read:confluence-props
    - write:confluence-props

src/index.jsx

import ForgeUI, { render, Fragment, Macro, Text } from "@forge/ui";
import { Queue } from '@forge/events';
import Resolver from "@forge/resolver";

const testQueue = new Queue({ key: 'test-updates' });

const App = () => {
  return (
    <Fragment>
      <Text>Hello world!</Text>
    </Fragment>
  );
};

export const run = render(
  <Macro
    app={<App />}
  />
);

const testResolver = new Resolver();
testResolver.define("test-event-listener", async ({ eventPayload, eventContext }) => {
  console.log(`TEST event queue listener`);
  if (eventPayload === undefined || eventContext === undefined) {
    console.log(`TEST event queue listener: ERROR in QUEUE`);
   }
   else {
    console.log(`TEST event queue listener: All info about my context: ${JSON.stringify(eventContext, null, 2)}`);
    console.log(`TEST event queue listener: All info about my payload: ${JSON.stringify(eventPayload, null, 2)}`);
   }
});
export const testQueueHandler = testResolver.getDefinitions();

export async function dl_handleTriggerPageViewed( event, context) {
  console.log( `dl_handleTriggerPageViewed`);
  await testQueue.push( "Hello, world! I viewed a page!");
};

日志输出

INFO    2023-03-26T13:17:15.421Z aa532218-aaec-4829-a109-afdc513ece3d TEST event queue listener
INFO    2023-03-26T13:17:15.421Z aa532218-aaec-4829-a109-afdc513ece3d TEST event queue listener: ERROR in QUEUE

已尝试操作

  • 修改队列、函数、消费者名称
  • 卸载重装应用
  • 创建独立测试队列
  • 从不同类型函数推送队列消息

解决方案

1. 修正Resolver参数结构

Forge队列消费者的Resolver方法接收的是两个独立参数(payload和context),而非包含这两个属性的对象。原代码中的解构写法错误,导致参数未正确获取:

// 修正后的消费者代码
testResolver.define("test-event-listener", async (payload, context) => {
  console.log(`TEST event queue listener`);
  if (payload === undefined || context === undefined) {
    console.log(`TEST event queue listener: ERROR in QUEUE`);
   }
   else {
    console.log(`TEST event queue listener: All info about my context: ${JSON.stringify(context, null, 2)}`);
    console.log(`TEST event queue listener: All info about my payload: ${JSON.stringify(payload, null, 2)}`);
   }
});

2. 更新Forge CLI版本

旧版本CLI可能存在队列参数传递的bug,执行以下命令更新:

npm install -g @forge/cli

3. 验证配置一致性

确保manifest中消费者的queue值与创建Queue实例时的key完全一致(大小写敏感),同时确认函数权限范围覆盖必要的队列操作权限。

4. 检查平台状态

确认Atlassian Forge平台是否存在服务异常,临时故障可能导致队列消息参数丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 17:43:12