cf中的nodejs常用代码片
Easul Lv6

主入口

JAVASCRIPT
1
2
3
4
5
6
7
// addEventListener用于拦截request,会传入一个event对象
// 处理的时候只需要给自己处理函数handleRequest传入request对象
// 然后处理请求中的url,headers,content等
// 最后返回一个response对象即可
addEventListener("fetch", event => {
event.respondWith(handleRequest(event.request))
})

request的url处理

JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
handleRequest(request) {
// 获取请求url字符串
let url = request.url;
// 创建url对象,可获取各个部分的参数
// 修改参数之后,url对象会改变
url = new URL(url);
// 主机:test.cloudflare.com:8443
console.log(url.host);
// 主机名:test.cloudflare.com
console.log(url.hostname);
// 整个链接:https://nameless-boat-6b51.wangwenbor.workers.dev:8443/asdf/asdf?asdf=fff
console.log(url.href);
// 协议+主机:https://nameless-boat-6b51.wangwenbor.workers.dev:8443
console.log(url.origin);
// 路径名:/asdf/asdf
console.log(url.pathname);
// 端口:443
console.log(url.port);
// 协议:https
console.log(url.protocol);
// ?+查询的参数:?asdf=fff
console.log(url.search);
// 获取某个参数的值
console.log(url.searchParams.get("asdf"));
// 设置某个参数的值
url.searchParams.set("asdf", "aaaaa");
console.log(url.href);
}

request的headers处理

JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
handleRequest(request) {
// 获取headers对象,是只读的键值对
let headers = request.headers;
// 通过迭代器获取headers中所有头的键
for(var key of headers.keys()) {
console.log(key);
}
// 可通过get方法获取值
console.log(headers.get("user-agent"));
// 想要设置头,需要再创建一个Headers
let newHeaders = Headers(headers);
newHeaders.set("host", "test.cloudflare.com");
}

request的请求体处理

JAVASCRIPT
1
2
3
4
handleRequest(request) {
// 获取请求体,然后就可以操作了
let body = await request.text();
}

response处理

JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
handleRequest(request) {
// fetch返回的是一个response对象
// 所以如果不需要修改response,可以直接返回
// await和async是成对出现的,因为fetch是异步的,就需要等待
let response = await fetch(request);
// 可以直接返回response
// return response
// 或者对响应进行操作
// response相关文档:https://developer.mozilla.org/zh-CN/docs/Web/API/Response
let responseClone = response.clone();
// 响应码
console.log(responseClone.status);
// 响应是否进行了跳转
console.log(responseClone.redirected);
// 操作响应头,可以get,set,delete,append,has
let responseCloneHeaders = new Headers(responseClone.headers);
// 获取响应体
// html可以这样获取
// 如果用responseClone.text().then(data => {console.log(data)})会没有反应,所以直接await获取响应即可
let responseBody = await responseClone.text();
// json可以这样获取
let responseBody = await responseClone.json();
// 操作完后组装响应并返回
// responseBody可以放响应的responseClone.body的流
// 也可以放上边的text()和json()
response = new Response(responseBody, {
status: responseClone.status,
headers: responseCloneHeaders
});
return response;
}

http请求

普通流程

JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
handleRequest(request) {
// fetch的一些文档:https://developer.mozilla.org/zh-CN/docs/Web/API/fetch
// url可以是URL对象或字符串
let url = "https://test.cloudflare.com";
let method = "GET";
let headers = {
"Host": "www.cloudflare.com"
};
let params = {
"wd": "hello"
};
let response = await fetch(url, {
method: method,
headers: headers,
params: params,
})
return response;
}

自定义跳转

JAVASCRIPT
1
2
3
4
5
6
// 参考文档:https://developer.mozilla.org/zh-CN/docs/Web/API/Response/redirect
handleRequest(request) {
var destinationURL = "http://test.cloudflare.com";
var statusCode = "301";
return Response.redirect(destinationURL, statusCode);
}

简单请求处理

JAVASCRIPT
1
2
3
4
5
6
handleRequest(request) {
// 只修改了url,不需要修改headers,method,params等,可以直接用request创建请求
// 修改了的话,request就要换成{method: method}的对象了
let newRequest=new Request(url,request);
return fetch(newRequest);
}

数组常用方法

JAVASCRIPT
1
2
3
let list = ["a", "b", "c"];
// 查看某个值是否在数组中
console.log(list.includes("c"));
 评论