Cloudflare Docs
Workers
Workers
Visit Workers on GitHub
Set theme to dark (⇧+D)

Aggregate requests

Send two GET request to two urls and aggregates the responses into one response.

export default {
async fetch(request) {
/**
* someHost is set up to return JSON responses
* Replace url1 and url2 with the hosts you wish to send requests to
* @param {string} url the URL to send the request to
*/
const someHost = "https://examples.cloudflareworkers.com/demos";
const url1 = someHost + "/requests/json";
const url2 = someHost + "/requests/json";
const type = "application/json;charset=UTF-8";
/**
* gatherResponse awaits and returns a response body as a string.
* Use await gatherResponse(..) in an async function to get the response body
* @param {Response} response
*/
async function gatherResponse(response) {
const { headers } = response;
const contentType = headers.get("content-type") || "";
if (contentType.includes("application/json")) {
return JSON.stringify(await response.json());
} else if (contentType.includes("application/text")) {
return response.text();
} else if (contentType.includes("text/html")) {
return response.text();
} else {
return response.text();
}
}
const init = {
headers: {
"content-type": type,
},
};
const responses = await Promise.all([fetch(url1, init), fetch(url2, init)]);
const results = await Promise.all([
gatherResponse(responses[0]),
gatherResponse(responses[1]),
]);
return new Response(results.join(), init);
},
};

const handler: ExportedHandler = {
async fetch(request: Request) {
/**
* someHost is set up to return JSON responses
* Replace url1 and url2 with the hosts you wish to send requests to
* @param {string} url the URL to send the request to
*/
const someHost = "https://examples.cloudflareworkers.com/demos";
const url1 = someHost + "/requests/json";
const url2 = someHost + "/requests/json";
const type = "application/json;charset=UTF-8";
/**
* gatherResponse awaits and returns a response body as a string.
* Use await gatherResponse(..) in an async function to get the response body
* @param {Response} response
*/
async function gatherResponse(response) {
const { headers } = response;
const contentType = headers.get("content-type") || "";
if (contentType.includes("application/json")) {
return JSON.stringify(await response.json());
} else if (contentType.includes("application/text")) {
return response.text();
} else if (contentType.includes("text/html")) {
return response.text();
} else {
return response.text();
}
}
const init = {
headers: {
"content-type": type,
},
};
const responses = await Promise.all([fetch(url1, init), fetch(url2, init)]);
const results = await Promise.all([
gatherResponse(responses[0]),
gatherResponse(responses[1]),
]);
return new Response(results.join(), init);
},
};
export default handler;