Atlassian Confluence Forge 使用异步事件有什么问题?

问题描述 投票:0回答:1

我必须在我的 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()
  • 从渲染函数推送

还有更多,但没有运气。我的队列消息没有回来。

confluence confluence-forge
1个回答
0
投票

答案是:不要在函数中使用自己的变量名。而不是

testResolver.define("test-event-listener", async ({ eventPayload, eventContext }) => {

应该是

testResolver.define("test-event-listener", async ({ payload, context }) => {

因为设置取决于您使用那些确切的变量名称(示例中也使用过)。感谢 Atlassian 工作人员的回答。

© www.soinside.com 2019 - 2024. All rights reserved.