我必须在我的 Forge 应用程序中创建一个队列解决方案。起初,它工作得很好。从 https://developer.atlassian.com/platform/forge/runtime-reference/async-events-api/ 很容易实现。然后——对我来说,突然间——昨天,我的消费者突然得到
undefined
有效载荷和上下文。从那以后我就一直在为这个问题而苦恼。我现在已经删除了我的应用程序中的所有异步事件(队列)代码,除了一个简单的测试设置。我仍然遇到这个问题,我开始怀疑是不是我(可能,然后很可能是异步/等待/承诺),或者(部分也是)伪造。
[更新:我创建了一个新的最小应用程序,所以我可以在这里发布完整的设置]
我基于使用
forge create
创建的新应用程序创建了一个全新的最小实现:
清单.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
换句话说,队列机制是可操作的,但是payload和event是未定义的。对我来说,这是“突然”发生的,我无法将它与我所做的事情联系起来。我觉得在我的影响之外出现了问题(锻造本身)。当然通常情况并非如此(我通常会责怪自己)但现在,我不再确定了。
我完全在开发中工作,以防万一。
我真的很感激这里的解决方案。我完全被困住了,现在已经好几天了,我完全不知道我能做些什么试错。我把我能想到的都做了,包括但不限于:
.then()
useState()
还有更多,但没有运气。我的队列消息没有回来。
答案是:不要在函数中使用自己的变量名。而不是
testResolver.define("test-event-listener", async ({ eventPayload, eventContext }) => {
应该是
testResolver.define("test-event-listener", async ({ payload, context }) => {
因为设置取决于您使用那些确切的变量名称(示例中也使用过)。感谢 Atlassian 工作人员的回答。