地图集-连接-表达式: 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.jsonlocalBaseUrl: 加法的基 URIhostBaseUrl: 目标应用程序的基础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。 。 。 .
参见 远程合同参考
关于这些属性的更多信息.
request.context.forge.tokens.app: 代表应用程序的即时使用访问符request.context.forge.tokens.user: 代表当前用户的即用访问令牌request.context.forge.apiBaseUrl: API 基础 URL,所有产品 API 请求应当被路由. 示例 https://api.atlassian.com/ex/coffec.822e2f-510f-48b9-b8d2-8419d0932949 页面存档备份,存于互联网档案馆request.context.forge.app: 关于应用程序和安装上下文的信息request.context.forge.context: 产品和推广特定数据,包括配置.
向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 本地测试将失败, 原因是缺少一个二进制.