I have a Jira Cloud Forge app that must fetch data from one of my company’s API.
This is my project structure and source code:
My manifest.yml
file:
scopes:
- read:jira-work
external:
fetch:
backend:
- 'my-backend-service-url-dev:8080/my-api/*'
- 'my-backend-service-url-qa:8080/my-api/*'
- 'my-backend-service-url-prod:9080/my-api/*'
My src/frontend/index.jsx
file:
import React, { useEffect, useState } from 'react';
import { invoke, requestJira } from '@forge/bridge';
import ForgeReconciler, { useProductContext } from '@forge/react';
// some imports are hidden for brevity
const App = () => {
const context = useProductContext();
const [response, setResponse] = useState(null);
const performRequest = async () => {
invoke('my-backend-resolver-fetch-function', {
id: id,
myDomainData: myDomainData,
user: context.accountId }).then(setResponse);
/*sometimes this will print 'null' until I call this function "performRequest" again
although this is not my main issue, it is also quite annoying, is there a way to "force"
some sort of wait on my .then(setResponse)? */
console.log(`Backend response: ${response}`);
}
}
My src/resolvers/index.js
file:
import Resolver from '@forge/resolver';
import api, { fetch, route } from "@forge/api";
const resolver = new Resolver();
resolver.define('my-backend-resolver-fetch-function', async (req) => {
var id = req.context.id;
var user = req.context.user;
const body = JSON.stringify({
id : id,
user : user
});
const url = 'http://my-backend-service-url-dev:8080/my-api/my-resource';
const response = await fetch(url, {
method: 'POST',
body: JSON.stringify(body),
headers: {'Content-Type': 'application/json'}
});
try {
if (response.ok) {
const responseJson = await response.json();
// by the way, the `console.log()` on resolvers never actually outputs
// to the browser console on F12 (developer tools)
console.log(`Successful operation: ${responseJson}`);
return responseJson;
} else {
console.log(`Failed operation: ${response}`);
return response;
}
} catch (error) {
return error;
}
});
export const handler = resolver.getDefinitions();
Finally, the issues:
- I sent the ‘my-backend-resolver-fetch-function’ to the backend resolver because calling (fetching) the API on the frontend was throwing an error
- Fetching the URL with ‘http://’ on the resolver throws the following error:
Uncaught (in promise) Error: There was an error invoking the function - Only HTTP(S) protocols are supported
at invoke (https://jira-frontend-bifrost.prod-east.frontend.public.atl-paas.net/assets/async-forge-ui-issue-view-extension.673c2a5b.js:38:55839)
at async https://jira-frontend-bifrost.prod-east.frontend.public.atl-paas.net/assets/async-forge-ui-issue-view-extension.673c2a5b.js:38:86137
- Fetching the URL without the
http
throws the following error:
global-bridge.js:2
Uncaught (in promise) Error: There was an error invoking the function - request to http://my-backend-service-url-dev:8080/my-api/my-resource failed, reason: getaddrinfo ENOTFOUND my-backend-service-url-dev
at invoke (https://jira-frontend-bifrost.prod-east.frontend.public.atl-paas.net/assets/async-forge-ui-issue-view-extension.673c2a5b.js:38:55839)
at async https://jira-frontend-bifrost.prod-east.frontend.public.atl-paas.net/assets/async-forge-ui-issue-view-extension.673c2a5b.js:38:86137
Error: There was an error invoking the function - request to http://my-backend-service-url-dev:8080/my-api/my-resource failed, reason: getaddrinfo ENOTFOUND my-backend-service-url-dev
at fe.error (
I also tried adding the following to my manifest.yml
file:
remotes:
- key: backend-dev
baseUrl: "http://my-backend-service-url-dev:8080"
operations:
- fetch
- key: backend-qa
baseUrl: "http://my-backend-service-url-qa:8080"
operations:
- fetch
- key: backend-prod
baseUrl: "http://my-backend-service-url-prod:9080"
But that’ll lead to the following error upon running forge deploy
:
Deploying your app to the development environment.
Press Ctrl+C to cancel.
Running forge lint...
No issues found.
× Deploying my-jira-cloud-forge-app to development...
i Packaging app files
i Uploading app
i Validating manifest
Error: Invalid Egress permissions: Invalid URL detected for EGRESS permissions object: http://my-backend-service-url-dev, my-backend-service-url-qa
Learn more at https://developer.atlassian.com/forge-content-security-and-egress-controls (requestId: c433e1ae706b4c279f6e035b635dcb4d)
I’m stuck on this for several hours - if not days - now and have searched everywhere in and outside this forum.
By the way, my backend API url is http
, not https
(at least not in dev).
Can anyone help, please?
Thank you.