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
相关产品推荐
相关产品推荐

