I’m new to JavaScript and I’m trying make a Github API Gateway for IFTTT(cause it can’t modify header) with JS on Cloudflare Worker. Here’s the code:
JavaScript
x
54
54
1
async function handleRequest(request) {
2
var url = new URL(request.url)
3
var apiUrl = 'https://api.github.com' + url.pathname
4
var basicHeaders = {
5
'User-Agent': 'cloudflare',
6
'Accept': 'application/vnd.github.v3+json'
7
}
8
9
10
const { headers } = request
11
const contentType = headers.get('content-type')
12
const contentTypeUsed = !(!contentType)
13
14
if (request.method == 'POST' && contentTypeUsed) {
15
if (contentType.includes('application/json')) {
16
var body = await request.json()
17
18
if ('additionHeaders' in body) {
19
var additionHeaders = body.additionHeaders
20
delete body.additionHeaders
21
}
22
23
var apiRequest = {
24
'headers': JSON.stringify(Object.assign(basicHeaders,additionHeaders)),
25
'body': JSON.stringify(body),
26
}
27
28
} else {
29
return new Response('Error: Content-Type must be json', {status: 403})
30
}
31
32
const newRequest = new Request(apiUrl, new Request(request, apiRequest))
33
34
try {
35
var response = await fetch(newRequest)
36
return response
37
} catch (e) {
38
return new Response(JSON.stringify({error: e.message}), {status: 500})
39
}
40
41
} else {
42
var apiRequest = {
43
'headers': JSON.stringify(basicHeaders)
44
}
45
const newRequest = new Request(apiUrl, new Request(request, apiRequest))
46
var response = await fetch(newRequest)
47
return response
48
}
49
}
50
51
addEventListener('fetch', async (event) => {
52
event.respondWith(handleRequest(event.request))
53
})
54
And I got this error when I tried to run it:
JavaScript
1
7
1
Uncaught (in promise)
2
TypeError: Incorrect type for the 'headers' field on 'RequestInitializerDict': the provided value is not of type 'variant'.
3
at worker.js:1:1245
4
at worker.js:1:1705
5
Uncaught (in response)
6
TypeError: Incorrect type for the 'headers' field on 'RequestInitializerDict': the provided value is not of type 'variant'.
7
This is an older version which run well but with less flexibility:
JavaScript
1
59
59
1
async function handleRequest(request) {
2
var url = new URL(request.url)
3
var apiUrl = 'https://api.github.com' + url.pathname
4
var accessToken = 'token '
5
6
var apiRequest = {
7
headers: {
8
'User-Agent': 'cloudflare',
9
'Accept': 'application/vnd.github.v3+json'
10
}
11
}
12
13
const { headers } = request
14
const contentType = headers.get('content-type')
15
const contentTypeUsed = !(!contentType)
16
17
if (request.method == 'POST' && contentTypeUsed) {
18
if (contentType.includes('application/json')) {
19
var body = await request.json()
20
21
if ('token' in body) {
22
accessToken += body.token
23
delete body.token
24
}
25
26
var apiRequest = {
27
headers: {
28
'Authorization': accessToken,
29
'User-Agent': 'cloudflare',
30
'Accept': 'application/vnd.github.v3+json'
31
},
32
body: JSON.stringify(body),
33
}
34
35
} else {
36
return new Response('Error: Content-Type must be json', {status: 403})
37
}
38
39
const newRequest = new Request(apiUrl, new Request(request, apiRequest))
40
41
try {
42
var response = await fetch(newRequest)
43
return response
44
} catch (e) {
45
return new Response(JSON.stringify({error: e.message}), {status: 500})
46
}
47
48
} else {
49
const newRequest = new Request(apiUrl, new Request(request, apiRequest))
50
51
var response = await fetch(newRequest)
52
return response
53
}
54
}
55
56
addEventListener('fetch', async (event) => {
57
event.respondWith(handleRequest(event.request))
58
})
59
The only difference seems to be apiRequest
, but I don’t know how to fix it. I tried to claim the variable with var apiRequest = new Object()
first but didn’t work.
Advertisement
Answer
Fix with this:
JavaScript
1
4
1
let apiRequest = new Object
2
apiRequest.headers = Object.assign(basicHeaders, additionHeaders)
3
apiRequest.body = JSON.stringify(body)
4
And the apiRequest
will look like this:
JavaScript
1
2
1
{headers:{},body:"{}"}
2
This seems like what RequestInitializerDict
want.