您好!中文維基百科社群現正檢討管理人員任免制度,並籌劃仲裁委員會首屆委員選舉方案。歡迎參與相關討論,並踴躍提出意見。 |
- 註:此通告由MediaWiki message delivery(留言)於2024年9月21日 (六) 13:42 (UTC)寄送。若您未來長期或目前暫時不欲接收任何類似訊息,可考慮婉拒消息發送。
您好!中文維基百科社群現正檢討管理人員任免制度,並籌劃仲裁委員會首屆委員選舉方案。歡迎參與相關討論,並踴躍提出意見。 |
您好,由于缺乏维护和兼容问题,维基媒体基金会和社群有意弃用结构式讨论(又称Flow),现在使用结构式讨论的讨论页未来将转换成Wikitext(维基文本)。因为您的讨论页启用了结构式讨论,所以向您递送此消息。我们邀请您参与相关讨论,并建议您先行考虑关闭此功能。如有问题,亦可至互助客栈求助区留言。給您帶來的不便,我們深表歉意。
当时本来想做POST支持,后来还是自觉遵守了m:NOP,所以写了这句话(意思就是我不提供编辑功能,你们想要可以自己写)。
当时还能编辑的,但是现在 Cloudflare 的 IP 段已被全域封禁(Open Proxy),所以已经不需要支持POST方法了。
Cloudflare Workers 使用的是 JavaScript 的 Fetch API,查一下相关文档就知道。
Mozilla 的 Fetch API 文档:
示例(send
是POST发送给服务器的数据,recv
是从服务器接收的数据,moreWork
是接收到数据后做的事,otherWork
是接收到数据前的空闲时间做的事):
/* 同步 */
var reply = await fetch(`https://zh.wikipedia.beta.wmflabs.org${url}`, {
method: 'POST',
body: send
})
var recv = reply.body//这行要等到上一行执行完毕后才执行
moreWork()
//因为是同步所以没有办法做otherWork
/* end */
/* 异步 */
fetch(`https://zh.wikipedia.beta.wmflabs.org${url}`, {
method: 'POST',
body: send
}).then(reply => {
var recv = reply.body
moreWork()
})
otherWork()
/* end */
回复是用event.respondWith(handleRequest(event.request))
完成的,所以handleRequest
这个函数的返回值会被当成是 Response。如果不改这个设计,就必须同步执行(在 handleRequest
函数内做完所有事并返回),不然的话就没东西可以返回,如果不写return就返回undefined,然后undefined就被当成是 Response Object并调用event.respondWith
传过去,然后event.respondWith
接收到无效值,就报错。
所以如果要用异步的话就把async function handleRequest(request) {
这行的上面改成这样,然后在需要的时候调用replyCallback
传入Response:
var replyCallback
addEventListener('fetch', event => {
replyCallback = event.respondWith
handleRequest(event.request)
})
send
是用来比喻“要用POST发送的数据”的,不要照搬(不然就报错ReferenceError),要把它换成一个实际的变量或字符串(比如说body: 'test'
会POST发送内容“test”给服务器),如果你是纯粹转发客户端请求的话写成这样就行:
//request变量是handleRequest函数接收的参数
{
method: request.method,//request的属性method是客户端的HTTP请求方法
body: request.body//如果request.method == 'POST',这个就是客户端POST请求发送过来的数据。
}
另外,因为没有调用replyCallback
函数去返回HTTP回复,所以当然就超时了......
所以,已有的new Response(...)
就不需要return了,直接改成调用replyCallback
传过去就行,所有用到return的地方都需要改(包括try那边的catch)。
因为报错TypeError: Illegal invocation
,所以如果要做异步的话就不能有handleRequest这一层,把操作全放到addEventListener的回调哪里才行,我试了一下还是莫名其妙Connection timed out。
不如干脆用同步算了,比如说这个示例:
/**
* https://********************************.cloudflareworkers.com/
* https://beta.zhwiki.workers.dev/
**/
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(req) {
try{
var url = (new URL(req.url))
if(url.protocol != 'https:'){
url.protocol = 'https:'
return (new Response('', {status: 301, headers: {'Location': url.href}}))
}
var header = (new Headers(req.headers))
var ua = header.get('User-Agent')
var ual = ua.toLowerCase()
var host = url.hostname
var path = url.pathname
var argv = url.search
if(path == '/'){
return (new Response('', {status: 302, headers: {'Location': '/wiki/'}}))
}
if(path == '/w/api.php'){
return (new Response('Api error', {status: 403, statusText: 'Error : https://beta.zhwiki.workers.dev/ can\'t not use MediaWiki Api'}))
}
var res = await fetch(`https://zh.wikipedia.beta.wmflabs.org${path}${argv}`, {
method : req.method,
body: req.body
})
return (new Response(res.body, {status: res.status, headers: res.headers}))
} catch(err){
return (new Response(err, {status: 500}))
}
}
报错TypeError: Illegal invocation
就说明这个函数是上下文敏感的,所以要做异步的话就要保持上下文一致:
addEventListener('fetch', event => {
handleRequest(event.request, (...args) => event.respondWith.apply(event, args))
})
async function handleRequest(req, replyCallback) {
然而还是Connection timed out,debug:
async function handleRequest(req, replyCallback) {
replyCallback(new Response('Test'))
return
能正常输出“Test”(上下文问题解决了),难道是then的回调没有被调用导致超时?但是我在浏览器F12那里测试fetch发现then的回调是会被调用的,那就说明是 Cloudflare Workers 自己没有实现这个。
所以说 JavaScript 是可以异步的,但是 Cloudflare Workers 不行(要用await)。
是的。
如果你还想继续使用类似服务的话,那么你可以使用Cloudflare Workers,具体方法参见H:VISIT#镜像网站中的“Cloudflare Workers”这一节。
在这次调查中分享您的经验
V7p75nsw965bplhu您好:
几周前,我们邀请您参加社群见解调查。 这是维基媒体基金会对我们全域社群的年度调查。 我们希望了解我们如何在维基上支持您的工作。 We are 10% towards our goal for participation. If you have not already taken the survey, you can help us reach our goal! Your voice matters to us.
请花15至25分钟在本调查中提供反馈。它有多种语言版本。
本调查由第三方主持并由这一份隐私声明管辖(英语)。
了解有关此项目的更多信息。 如果您有任何问题,或者您不希望收到有关参加此调查的未来消息,请电邮联络我们。
謹祝編安
RMaung (WMF) 2019年9月20日 (五) 19:57 (UTC)
在这次调查中分享您的经验
V70dlyas1706rqhk您好:
维基媒体基金会現正進行调查,以了解您在Wikipedia和维基媒体的经历的反馈。 本次调查的目的是了解基金会对您于维基站點的工作的支持程度,以及我们未来如何改变或改进東西。 您分享的意见将直接影响维基媒体基金会当前和未来的工作。
请花15至25分钟在本调查中提供反馈。它有多种语言版本。
本调查由第三方主持并由这一份隐私声明管辖(英语)。
了解有关此项目的更多信息。 如果您有任何问题,或者您不希望收到有关参加此调查的未来消息,请电邮联络我们。
謹祝編安
RMaung (WMF) 2019年9月9日 (一) 16:32 (UTC)