@atlassian/atlassian-connect-express

中文文档
12.2.3发布于 2026/05/01Apache-2.0TypeScriptCommonJS近 30 天下载 1.8万

用于在快递站上建造Atlassian Add-on的图书馆

中文使用文档
文档目录37 节
  1. ưμ㼯A
  2. 捷克
  3. 更多信息
  4. 发布注释
  5. 开始
  6. 创建工程
  7. 安装依赖关系
  8. 创造发展环境
  9. 运行您的添加服务器
  10. 开发环路
  11. 配置
  12. 地图集-连接.json
  13. 没有描述符运行 ACE
  14. 样本加载
  15. 脚手架
  16. 处理栏布局和模板
  17. 特殊上下文变量
  18. 排放的事件
  19. 食谱
  20. 如何与 JWT 保证线路的安全
  21. 如何用 JWT 保护安装回调线路
  22. 如何从 Iframe 发送签名的 HTTP 请求回加载服务
  23. 如何向主机发送已签名的输出 HTTP 请求
  24. 使用产品 REST API
  25. 福尔吉
  26. 认证 Forge 的请求
  27. 向Atlassian APIs提出请求
  28. 连接和伪造数据
  29. 如何部署到赫鲁库
  30. 解决问题
  31. "无法从 http://localhost:30/atlassian-connect.json 上连接并取回描述器,消…
  32. 调试 HTTP 流量
  33. 获得帮助
  34. 捐款
  35. 调取请求
  36. 发布新版本
  37. 单位测试

地图集-连接-表达式: Express.js的节点.js包 基于 Atlassian Add-ons

ưμ㼯A

终止对Atlassian连接框架的支持

Atlassian将与Atlassian连接平台同时停止对ACE框架的支持.

请看看这个 博客文章 用于连接支持结束的详细时间表.

我们鼓励开发者社区在需要时叉出并维护这些储存库.

捷克

atlassian-connect-express (ACE)是一个用于创建 阿特拉斯连接 基于加载 节点.js. Atlassian Connect是用于创建加成的分布式组件模型. 与Atlassian Connect公司所建的加码,将Atlassian以云为基础的应用扩展至标准网络协议和API. 要为Atlassian的服务器(premises)产品建立加码,请参见: 服务器开发者文档。 。 。 .

ACE就是那个 官方支持 Atlassian Connect的节点.js框架. 请阅读我们的文件,看看另一个 支助和社区 框架和工具。 。 。 . 在撰写自己的 Atlassian Connection 附加数据时, 您会发现推荐的工具非常有用; 请仔细浏览 工具清单,并尽可能将其用于援助发展.

请确保您总是使用最新的补丁版ACE,以确保您的加载有最新的安全补丁和 修复。 1.0.14和2.0.2之前的版本存在已知的安全弱点.

更多信息

ACE帮助您快速开始开发加载,将Node.js和Express作为加载服务器.

必须明白 快递 单是节点的网络应用框架。 ACE只是提供 一个中间软件和方便帮助器的图书馆,使Atlassian的加成更加容易。 具体而言,ACE补充说:

  • 在启动和关闭时处理针对您的Atlassian应用程序的注册和注销,从而优化了dev循环.
  • 检测更改到的文件系统监视器 atlassian-connect.json如果有的话。 当检测到变化时,加载会重新在主机注册.
  • JWT自动认证入境请求以及JWT为出境请求签名返回主机.
  • 自动坚持主机细节(即客户端密钥,主机公钥,主机基础url等).

发布注释

关于详细的发行说明和升级指南,请参见 发布注释。 。 。 .

开始

最快的启动方法是安装 @atlassian/atlas-connect CLI工具. CLI 可以生成ACE 快速启用加载脚手架 。 要安装 :

npm i -g @atlassian/atlas-connect

创建工程

我们先创建一个附加项目:

atlas-connect new <project_name>

这将在当前目录中创建一个新项目 .

安装依赖关系

更改为新项目目录 。 要绕过一些过时的过渡性依赖,在根上添加以下的覆盖 package.json 文件 :

  "overrides": {
    "form-data": "^4.0.4",
    "tough-cookie": "^4.1.3"
  }

然后安装依赖性 :

npm install

如果您得到与节点- gyp( 特别是Windows上的节点8) 相关的任何错误, 请尝试 安装其先决条件。 。 。 .

创造发展环境

此时,你们都准备运行附加程序,但是仍然需要安装在Jira或Confact. 您可以在任何您是管理员的 Jira 或 Convolution 主机中安装您的新添加, 但通常 最好为您创建一个新的主机,供您在开发期间使用. 跟着这个链接报名 自由的吉拉或相会云宿主.

运行您的添加服务器

在您的工程目录中, 运行 :

npm start

这将启动您的 Express 服务器在默认的 3000 端口 .

开发环路

此时,你可以开始建造你的附加. 但是,如果修改到 任何 JavaScript, 您需要重新启动快递 。 如果您想要您的服务器在 JavaScript 时自动重新启动 更改,考虑使用 节点恶魔 或诸如来.

自动登记

本节将描述如何配置 ACE , 这样它可以自动注册您的添加 Jira 或 Congublic host, 重新登记对描述符的更改, 并注销关闭的注册 .

注意自动注册需要在启动时显示一个描述文件.

要获得此功能, 您需要:

生成一个 Atlassian API 令牌

  • 创建名为的文件 credentials.json, (中文(简体) ),
  • 复制并粘贴 此文件, (中文(简体) ),
  • 添加 credentials.json 页:1 .gitignore 文档,以及
  • 更改文件内容以包含与您的开发环境的链接, 电子邮件为用户名 , API 令牌 作为密码和产品名称.

公开显示您的附加( 打开您自己的地道)

  • 截至第12版,ngrok地道不再自动创建.
  • 如果您的 Atlassian 主机是远程的 (*. atlassian.net), 您的加载必须可以公开获取 。 ACE不再创建或管理地道.
  • 使用任何方法公开曝光您的本地服务(例如ngrok这样的地道提供商).
  • 配置 ACE 通过配置 AC LOCAL BASE URL 或 localBaseUrl 来使用您的公共 URL
export AC_LOCAL_BASE_URL=https://your-public-url.example

ACE 在您开发主机上注册您的添加时, 将使用您配置的公共基址 URL .

配置

您添加的配置在两个文件中完成 :

  • ./config.json - 说吧 此文件包含您插件运行的每个运行时环境的配置 。 文件已经 注释帮助您理解可用的设置.
  • ./atlassian-connect.json - 说吧 此文件是您添加的所有扩展点的列表 。 要查看所有可供 Jira 使用的扩展点选项,请检查该选项的模块部分 地图集连接的Jira模块文件。要检查所有可用的“聚合”扩展点选项,请检查该模块的模块部分 地图集连接的聚合模块文件。 。 。 .

通过设置 AC_OPTS 环境变量(见本节末尾).

配置( json)

这个 ./config.json 文件包含添加服务器的所有设置。 此文件被分解为环境 .

{
  // This is the default environment. To change your app to use
  // a different env, set NODE_ENV (http://expressjs.com/api.html#app.configure)
  "development": {
    // Set to true if your app contains a errorHandler middleware:
    // https://expressjs.com/en/guide/error-handling.html
    "expressErrorHandling": false,

    // This is the port your Express server will listen on
    "port": 3000,

    // Use views/unauthorized.hbs for error page.
    "errorTemplate": true,
    // Use custom error template
    // "errorTemplateName": "auth-response-handler.jsx",
    
    // Use Custom error object for error template
    // "errorTemplateObject": {
    //     "title": "App not authorized!",
    //     "unauthorized": true
    // },

    // To enable validation of descriptor on startup and every time it changes,
    // add the optional config validateDescriptor to true
    "validateDescriptor": true,

    // atlassian-connect-express currently integrates with Sequelize for
    // persistence to store the host client information (i.e., client key,
    // host public key, etc). When no adapter is specified, it defaults to
    // Sequelize's fallback memory storage.
    //
    // To specify a backend for Sequelize  other than "memory", set the
    // "dialect" value to one of Sequelize's other supported dialects.
    //
    // To use your own storage adapter, add the key
    // "adapter" to the following configuration, and replace "dialect"
    // and "connection" with any values your adapter expects.  Then make sure
    // that you register your adapter factory with the following code in
    // app.js:
    //
    //   ac.store.register(adapterName, factoryFn)
    //
    // See `atlassian-connect-express/lib/store/index.js` and the default
    // `sequelize.js` files for code demonstrating how to write a
    // conformant adapter.  The default values are as follows:
    //
    //   "store": {
    //     "adapter": "sequelize",
    //     "dialect": "sqlite",
    //     "storage": ":memory:"
    //   },
    //
    //
    // To use sqlite with a persistent file instead of an in-memory database, the following settings can be used,
    // and will result in a store.db file being created in the working directory of the app:
    // 
    //   "store": {
    //     "adapter": "sequelize",
    //     "dialect": "sqlite3",
    //     "url": "sqlite://./store.db"
    //   },
    //
    // To instead configure, say, a PostgreSQL store, the following could be
    // used:
    //
    //   "store": {
    //     "adapter": "sequelize",
    //     "dialect": "postgres",
    //     "url": "postgres://localhost/my_addon_database",
    //     "table": "MySetting" //optional - table name. Default is "AddonSetting"
    //     "logging": function, //optional - function that gets executed every time Sequelize would log something.
    //     "pool": {}           //optional - pool options you have that you may pass to sequelize adapter
    //   },
    //
    // For MongoDB, use the following:
    //
    //   "store": {
    //     "adapter": "mongodb",
    //     "url": "mongodb://localhost:27017/my_addon_database",
    //     "collection": "AddonSettings"
    //   },
    //
    // For Redis, use the following:
    //
    //   "store": {
    //     "adapter": "redis",
    //     "url": "redis://localhost:6379",
    //   },    
    //
    // For DynamoDB, use the following:
    //
    //   "store": {
    //     "adapter": "dynamodb",
    //     "table": "AddonSettings",
    //     "region": "us-east-1",
    //   },
    //
    //  Note that the DynamoDB table should have "clientKey" as a string
    //  partition key and "key" as a string sort key.
    //
    // You will also need an appropriate Sequelize driver if you choose something
    // other than the default "dialect".  In the PostgreSQL case you'd need to
    // run the following command to add the proper support:
    //
    //   $ npm install --save pg
    //
    // You will also need aws-sdk if you choose the DynamoDB driver:
    //
    //   $ npm install --save @aws-sdk/client-dynamodb
    //

  },

  // This is the production add-on configuration, which is enabled by setting
  // the NODE_ENV=production environment variable.
  "production": {
    // On a PaaS host like Heroku, the runtime environment will provide the
    // HTTP port to you via the PORT environement variable, so we configure
    // that to be honored here.
    "port": "$PORT",
    // This is the public URL to your production add-on.
    "localBaseUrl": "https://your-subdomain.herokuapp.com",
    // This is the URL to atlassian connect all.js.
    "hostScriptUrl": "https://connect-cdn.atl-paas.net/all.js",
    "store": {
      // You won't want to use the memory store in production, or your install
      // registrations will be forgotten any time your app restarts.  Here
      // we tell atlassian-connect-express to use the PostgreSQL backend for the default
      // Sequelize adapter.
      "dialect": "postgres",
      // Again, a PaaS host like Heroku will probably provide the db connection
      // URL to you through the environment, so we tell atlassian-connect-express to use that value.
      "url": "$DATABASE_URL"
    },

    // If your app supports multiple baseUrls,
    // additional baseUrls can be added here so that it can be used to
    // verify the `audience` claim during installation lifecycle callback.
    "allowedBaseUrls" : [
      "https://other-domain.herokuapp.com"
    ],

    // Make sure that your add-on can only be registered by the hosts on
    // these domains.
    "whitelist": [
      "*.jira-dev.com",
      "*.atlassian.net",
      "*.jira.com"
    ]
  }
  
  // If your app is being used as a remote backend for Forge, this value will 
  // set the clock tolerance to use when verifying the `not before time` and 
  // `expiration time` claims in the invocation token.  The value is in seconds.
  // "clockTolerance": 0
}

AC OPTS (法语)

AC OPTS环境变量可用于改变ACE的行为以方便开发,比如:

AC_OPTS=no-auth,force-reg node app.js

设定为包含以下一个或多个值的被分隔的空格或逗号列表.

军法 让加载器在启动时以运行 Jira 或 Conculation 主机来注册 (通常自动注册只在加载使用存储器时才会发生). 此环境变量必须存在描述文件才能应用 .

部队德格 关闭时运行 Jira 或 Conclusive 主机, 使加码自动取消注册 (通常只有在加载使用内存存储或运行在开发模式下时才会自动注册). 此环境变量必须存在描述文件才能应用 .

无记录 运行 Jira 或 Congublishing 主机, 使加载永不注册 (即即使使用记忆存储器也不自动注册).

无 跳过收到的请求的认证(即不检查或验证JWT令牌).

地图集-连接.json

这个 atlassian-connect.json 描述你加的会做什么。 说明书有三个主要部分: 描述您添加的信息(即名称、描述、密钥等)、权限和认证信息, 并列出您添加的组件列表 。 此描述符被发送到主机( 即 Jira 或 Collection) 当您的加载安装时.

查看当前 atlassian-connect.json,访问 地图集连接文件

如果您需要您描述符的预处理步骤, 您可以通过修改您的描述符来配置 app.js 使变压器包括在 config编辑 descriptorTransformer 属性预计为 函数和通过 descriptor 作为物体,以及 app.config 对象.

var addon = ac(app, { config: {
  descriptorTransformer: function(descriptor, config) {
    if (config.environment() === "production") {
      descriptor.key = "production-key";
    }
    return descriptor;
  }
}});

没有描述符运行 ACE

ACE在以描述符启动您添加的服务器时,能够自动注册/删除您的应用程序与您的主机,并配置来自描述符的路由. 然而,在迁移到Forge时,您可能不再对描述文件有任何用途,因此可能想要在没有它的情况下运行ACE. 在这种情况下,必须意识到以下功能的变化:

  • ACE将不再自动注册您的附加, 重新注册描述符的更改, 并注销关闭时的注册 .
    • 这个 AC_OPTS 环境变量不会改变这种行为
  • ACE不再根据描述定义自动生成路径. 例如 /installed 使用寿命周期处理器或描述符中定义的任何webhook处理器将不再生成.
    • 如果您的添加需要这些, 您必须手动执行 .
    • 任何认证中间软件都可以通过配置 localBaseUrl 或者说 allowedBaseUrls 区域 config.json
  • 这个 createJwtPayload 方法,作为 HostClient 类,如果不提供发件人作为参数,则默认使用附加键.
    • 此默认行为可以通过配置 appKey 输入 config.json 或经过 AC_APP_KEY 环境变量.

只要您继续使用任何连接模块,描述符就不应该被删除.

样本加载

脚手架

当你生成新的 ACE 添加, 你实际上只是下载一个副本 Express.js 模板的 Atlassian 连接。 。 。 .

处理栏布局和模板

底部脚手架使用 处理栏 通过该模板库 速记 软件包.

手提栏视图存储于 ./views 目录。 基准模板包含一个 layout.hbs 和样本页 (单位:千美元)hello-world.hbs) (中文(简体) ). 单靠手提棒并不能提供布局,但 express-hbs 软件包。 应用 layout.hbs 在模板页面上添加以下内容:

{{!< layout}}

为了更深入地了解汉德勒巴斯如何用快活方式工作,请看看 速成文件。 。 。 .

特殊上下文变量

ACE 在您的渲染上下文中注入了几个有用的上下文变量 。 您可以访问任意 在您的模板中列出:

  • title: 加号名称(取自 atlassian-connect.json(中文(简体) )
  • addonKey: 定义于 atlassian-connect.json
  • localBaseUrl: 加法的基 URI
  • hostBaseUrl: 目标应用程序的基础URI(如果有的话包括上下文路径)
  • hostStylesheetUrl:用于 Connect 加载的基础 CSS 文件的 URL. 此样式表是一个最小的样式集 帮助你开始。 这不是完整的 AUI 样式表 .
  • hostScriptUrl: 连接JS客户端的URL. 这份联合材料文件载有建立无缝密码 iframe 介于添加和其父之间。 它还载有一些获取数据的方法和对象 通过父( 查找 AP 联合来文反对).
  • token:可以用来验证从iframe返回到加载服务的来电的符.
  • license: 许可证状况
  • context: 西北地区 context 索赔
  • clientKey: 客户端消费密钥, 用于识别请求来自的 Jira 或 Congress 主机
  • userAccountId:用户的Atlassian账户ID.
  • userId: (被贬)请求来源的用户名.
  • timeZone: (贬值)用户的时区
  • locale: (贬值) 用户的地块

您可以将上面的任何变量作为普通的 Handlebar 变量访问 。 例如,在页面中创建链接 链接到主机其它位置的:

<a href="{{hostBaseUrl}}/browse/JRA">Jira</a>

排放的事件

所有产品

  • host_settings_saved: 之后 /installed 生命周期, ACE 试图保存存储中的客户端信息( baseUrl, 客户端Key, app key, puglinsVersion, 产品Type, publicKey, 服务器Version, shareSecret). 如果成功保存, 此事件会被释放
  • host_settings_not_saved: 之后 /installed 生命周期,ACE试图保存存储中的客户端信息. 如果有任何错误或问题,此事件会被发布
  • addon_registered: ACE试图在 Jira 或 Conference 产品中注册或安装应用程序后
  • webhook_auth_verification_triggered: ACE 一旦尝试认证此事件, 将自动在描述文件中注册 Webhooks 和相应的路径
  • webhook_auth_verification_successful: ACE 一旦尝试认证并成功, 将自动在描述文件中注册 Webhooks 和相应的路径

吉拉/影响

  • addon_deregistered: 当ACE收到 SIGTERM, (中文(简体) ), SIGINT,以及 SIGUSR2 信号,它会解除应用程序的注册 并且这个事件已经发布

聆听一个事件:

addon.on(event, function() {
  // Add something here
});

食谱

如何与 JWT 保证线路的安全

加号通过JWT认证. 为了简化路线上的JWT验证,您只需添加一个 ACE 中间软件到您的路径 :

module.exports = function(app, addon) {
  app.get(
    '/protected-resource',

    // Protect this resource with JWT
    addon.authenticate(),

    function(req, res) {
      res.render('protected');
    }
  );
};

仅仅添加 addon.authenticate() 中间软件将保护您的资源.

如何用 JWT 保护安装回调线路

通过不对称JWT验证安装/Uninstall钩. 只需添加一个 捷克 authenticateInstall 自定义安装或卸载生命周期路径的中间软件 :

module.exports = function(app, addon) {
  app.post(
    '/uninstalled',

    // Protect this install callback resource with asymmetric JWT
    addon.authenticateInstall(),

    function(req, res) {
      res.status(204).send();
    }
  );
};

如果你收养了Forge,请确保 baseUrl 在您描述文件中配置的文本与在所有环境中的显示中匹配 。 匹配错误的碱基Urls会导致中间软件内部的认证出错. 为尽量减少出现差异的风险,考虑使用 config.json 参数化文件 localBaseUrl。 。 。 .

授权请求

如果您的app API 接受前端使用上下文 JWTs 的请求,则必须进行授权检查. Atlassian Connect Express中包含一个基本中间软件,它利用了 Jira 获得批量权限 API 财务报告和审定财务报表 组合检查内容权限 API 根据上下文JWT进行授权检查.

例如,将终点限制在同时也是项目管理员的Jira admins:

module.exports = function(app, addon) {
  app.get(
    '/admin-resource',

    [
      addon.authenticate(true /* accept context JWTs */),
      // only allow product admins that are also project admins
      addon.authorizeJira({ global: ["ADMINISTER"], project: ["ADMINISTER_PROJECTS"] })
    ],

    function(req, res) {
      res.render('protected');
    }
  );
};

同样,对于 Conference , 将一个端点限制在 Conference 管理员上, 这些管理员也有读取当前页面的权限 :

module.exports = function(app, addon) {
  app.get(
    '/admin-resource',

    [
      addon.authenticate(true /* accept context JWTs */),
      // only allow product admins that also have access to read the current page
      addon.authorizeConfluence({ application: ["administer"], content: "read" })
    ],

    function(req, res) {
      res.render('protected');
    }
  );
};

如何从 Iframe 发送签名的 HTTP 请求回加载服务

如上所述,装入iframe内容的初步呼叫由JWT保证。 然而,装入的内容不能 签名后续请求。 一个典型的例子是让AJAX调回加词的内容. Cookie 会话无法 由于许多浏览器默认会阻断第三方 cookie 。 ACE 提供中间软件 工作时不需要饼干 并且帮助从iframe 安全请求.

标准JWT标志用于认证从iframe返回加载服务的请求. 路径可以安全 使用 addon.checkValidToken() 中间软件 :

module.exports = function(app, addon) {
  app.get(
    '/protected-resource',

    // Require a valid token to access this resource
    addon.checkValidToken(),

    function(req, res) {
      res.render('protected');
    }
  );
};

为了保障您的路由安全, 信使必须是 HTTP 请求的一部分 。 可以这样 使用标准 jwt 查询参数 :

<a href="/protected-resource?jwt={{token}}">See more</a>

第二个选项是使用授权 HTTP 头, 例如用于 AJAX 请求 :

beforeSend: function(request) {
  request.setRequestHeader("Authorization", "JWT {{token}}");
}

您可以使用 token 内容可变。 例如,你可以嵌入 它在一个元标记中,从其中它以后可以用脚本读取:

<meta name="token" content="{{token}}">

如何向主机发送已签名的输出 HTTP 请求

ACE 捆绑并扩展 请求 HTTP客户端. 做一个 JWT 签名请求返回主机, 您只需使用 request ,但使用 URL 回 主持人的REST APIs.

var httpClient = addon.httpClient(req);
httpClient.get('/', function(err, res, body) {
  ...
});

如果在请求上下文中没有,您可以按以下方式进行等同的操作:

var httpClient = addon.httpClient({
  clientKey: clientKey  // The unique client key of the tenant to make a request to
});
httpClient.get('/', function(err, res, body) {
  ...
});

默认情况下,这些请求被认证为附加请求. 如果您想作为一个特定用户提出请求,则 #asUserByAccountId() 应使用方法。 在封面下,将为用户取取一个OAuth2无记名代号 你要求过.

var httpClient = addon.httpClient(req);
httpClient.asUserByAccountId('ebcab857-c769-4fbd-8ad6-469510a43b87').get('/rest/api/latest/myself', function(err, res, body) {
  ...
});

确保您通过 userAccountId ,而不是用户名或用户Key。 如果你之前使用过 #asUser() 与 userKey,您可以通过主机产品上的用户 REST 资源将其转换为用户 AccountId .

也可以设置自定义标题或发送窗体数据。 例如,请将一个文件附于Jira问题:

var filePath = path.join(__dirname, 'some.png');
fs.readFile(filePath, function(err, data) {
  httpClient.post({
    url: '/rest/api/2/issue/' + issueKey + '/attachments',
    headers: {
      'X-Atlassian-Token': 'nocheck'
    },
    multipartFormData: {
      file: [data, { filename: 'some.png' }]
    }
  },
  function(err, httpResponse, body) {
    if (err) {
      return console.error('Upload failed:', err);
    }
    console.log('Upload successful:', body);
  });
});

使用产品 REST API

某些 REST URL 可能需要 其他范围 应该添加到您的 atlassian-connect.json 文档.

福尔吉

您的 ACE 应用程序可以作为一个 forge 的远程后端。 。 。 .

要做到这一点,它必须有一个 appId 设置于 ./config.json。数值应为: app.id 如在福尔吉号上所示 显示。例如:

{
  "appId": "ari:cloud:ecosystem::app/406d303d-0393-4ec4-ad7c-1435be94583a"
}

或者,如果您的后端会支持多个应用程序,则可以提供列表:

{
  "appId": [
    "ari:cloud:ecosystem::app/406d303d-0393-4ec4-ad7c-1435be94583a",
    "ari:cloud:ecosystem::app/b7e2e2e2-3c4a-4b7a-9e2a-1f2b3c4d5e6f"
  ]
}

如果您使用 DynamoDB 适配器进行存储, 您还需要添加几个表格 用于 Forge 安装相关数据。 有代码试图创建这些表格 这里 但如果您的应用程序不能成功 没有必要的许可。 在这种情况下,请手动创建如下:

  • 一个 InstallationClientKeys 表格为 installationId 作为字符串分区键.

  • A 类 ForgeSettings 表格为 installationId 作为字符串分区键,以及 key 作为字符串排序键.

认证 Forge 的请求

这个 addon.authenticateForge() 中间软件将依照 远程合同 并设置以下属性: request.context.forge。 。 。 . 参见 远程合同参考 关于这些属性的更多信息.

向Atlassian APIs提出请求

ACE 框架允许您向 Atlassian API 提出请求。 请确保您的清单配置 以便你们获得所需的迹象 此处详述。 。 。 . 然后在处理Forge引用时使用ACE所曝光的Forge-aware HTTP客户端:

app.get("/forge/backend/resource", addon.authenticateForge(), async (req, res) => {
  const http = addon.forgeHttpClientAsApp(req); // or forgeHttpClientAsUser(req)
  const data = await http.get({ url: "/wiki/api/content" });
  res.json(data);
});

这个 addon.authenticateForge() 中间软件缓存应用程序令牌和 API 基础 URL 对应 用于以后使用的安装ID。 如果你是针对一项没有 来自Forge, 拥有适当的安装ID, 并向Atlassian 提出请求 APIs, 您可以使用 addon.forgeHttpClientAsAppForInstallation(installationId)。例如:

app.get("/external-event/{installationId}", async (req, res) => {
  const http = await addon.forgeHttpClientAsAppForInstallation(req.params.installationId);
  const data = await http.get({ url: "/wiki/api/content" });
  res.json(data);
});

注意,这些标志是短暂的, 如果你需要新鲜的标志与UI引用同步, 那么,请探索利用 预定触发器。 。 。 .

我们建议使用单独的线路 连接和福吉引用。 对于产品API呼叫 在Forge引用, 使用情况 addon.forgeHttpClientAsApp 或者说 addon.forgeHttpClientAsUser一般来说,没有必要使用 连接 addon.httpClient 在Forge路线之内.

连接和伪造数据

这个中间的软件配对 addon.authenticateForge() 财务报告和审定财务报表 addon.associateConnect() 存在主要是为了保护向后 从 Connect 迁移到 Forge 时设置访问的兼容性 。 它让你继续使用 addon.settings.get/set 与连接客户端 Key 连接,该客户端与 Forge 安装有关.

如果在单一的处理器中仍然需要两种上下文,你可以这样来作曲:

app.get("/forge/backend/resource", [addon.authenticateForge(), addon.associateConnect()], async (req, res) => {
  /* Both Connect and Forge context are available here, for example:
  addon.forgeHttpClientAsApp(req); // or forgeHttpClientAsUser(req)
  addon.settings.set("key", { value: "val" }, req.context.clientKey);
  req.context.forge;
  */
});

如何部署到赫鲁库

在开始前,安装 Git 和 Heroku 工具带。 。 。 .

如果你没有用git来跟踪你的附加, 现在是一个好时机这样做,因为赫鲁库需要这样做。 确保你 在工程主目录中运行以下命令:

git config --global user.name "John Doe"
git config --global user.email [email protected]
ssh-keygen -t rsa
git init
git add .
git commit . -m "some message"
heroku keys:add

接下来, 在 Heroku 上创建应用程序 :

heroku apps:create <add-on-name>

接下来,让我们把我们的注册信息 存储在Postgres数据库。 在开发中,你可能使用记忆 存储。 在制作中,你会想使用真正的数据库.

heroku addons:add heroku-postgresql:hobby-dev --app <add-on-name>

最后,让我们把项目文件添加到赫鲁库并部署!

如果您还没有到, 请切换到您的项目主目录 。 从那里运行这些命令:

git remote add heroku [email protected]:<add-on-name>.git
git push heroku master

赫鲁库要花一两分钟 才能给你加分 完成后,你将得到URL 在那里你 添加是部署的, 但是,你仍然需要注册 在你的Jira或Concluding主机.

要运行您在 Jira 或 Convolution 主机上添加的内容, 您必须进入生产模式 。 为此, 设置 NODE_ENV 可变到这样生产:

heroku config:set NODE_ENV=production

详细情况,我们建议阅读 从赫鲁库的节点开始。 。 。 .

解决问题

"无法从 http://localhost:30/atlassian-connect.json 上连接并取回描述器,消息为:java.net.ConnectException: Connect deferent"

如果Jira或Conculation无法访问,你就会发现这个错误 http://localhost:3000/atlassian-connect.json。 。 。 . 调试的方法之一是看命令是什么 hostname 返回.

如果它回来了 localhost,改变它。 在 OS X 上, 您需要在系统首选项中设置一个合适的“ 计算机名称 ” > 共享.

调试 HTTP 流量

有几个工具可以帮助在您添加的服务器和主机服务器之间搜索 HTTP 流量 :

  • 通过启动您的应用程序, 启用节点请求的 HTTP 记录 NODE_DEBUG=request node app
  • 检查 HTTP 调试代理 查尔斯 财务报告和审定财务报表 小提琴手
  • 尝试本地 TCP 嗅觉 正义 通过运行类似的东西 justniffer -i eth0 -r,替换正确的接口值

获得帮助

如果您需要帮助使用Express.js,请查看 API 参考 或开发者指南.

如果你需要帮助开发 阿特拉斯系统的产品,请查看 地图集开发者 网站.

如果您需要帮助使用ACE提供的功能,或想要报告工具包存在问题,请在表格中注明 阿特拉斯开发者社区。 。 。 .

捐款

调用请求,问题和评论是欢迎的! 也是开源的 Apache 2.0 (英语)所以,请随意 叉和发送我们拉请求.

对于拉动请求:

  • 添加新特性测试和错误修正 .
  • 遵循现有的样式.
  • 将无关的更改分别为多拉请求. 见现有的问题,以便开始作出贡献.

对于更大的变化,确保您首先通过创建一个问题并解释预期的变化来开始讨论.

调取请求

我们采取“信任”的方法来吸引请求。 这意味着审查人员应当感到自在地批准带有未决项目的公关,因为相信公关所有人将在必要时处理有关行动。 对特别重要的公关项目使用动作,因为这些动作要求公关所有人在合并前明确承认它们

发布新版本

请看 释放 关于发布新软件包版本的步骤.

单位测试

运行 npm run test。 。 。 .

注意:对于M1 Macbook 本地测试将失败, 原因是缺少一个二进制.

版本与发布记录

@atlassian/atlassian-connect-express 共发布 14 个版本,首次发布于 2025/05/20;过去 12 个月发布了 3 个版本。

版本发布日期距今
12.2.3latest2026/05/016 个月前
12.2.22026/01/299 个月前
12.2.02025/11/2011 个月前
12.1.12025/09/011.2 年前
12.1.02025/08/181.2 年前
12.0.12025/08/151.2 年前

关于 @atlassian/atlassian-connect-express 的常见问题

@atlassian/atlassian-connect-express 是什么?

用于在快递站上建造Atlassian Add-on的图书馆

如何安装 @atlassian/atlassian-connect-express?

在项目目录运行 npm install @atlassian/atlassian-connect-express,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:express(3.0 - 4)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@atlassian/atlassian-connect-express 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@atlassian/atlassian-connect-express 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@atlassian/atlassian-connect-express 可以商用吗?

@atlassian/atlassian-connect-express 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@atlassian/atlassian-connect-express 的下载量有多少?

根据 npm 官方下载统计,@atlassian/atlassian-connect-express 在 2026/10/07 – 2026/11/05 这 30 天内被下载 17,536 次,日均约 585 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@atlassian/atlassian-connect-express 还在维护吗?

最新版本 12.2.3 发布于 2026/05/01(6 个月前);至今共发布 14 个版本,其中过去 12 个月发布了 3 个;首次发布于 2025/05/20。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。