在开发过程中,如何在本地 运行 我的 cloudflare worker 无服务器功能?
How to locally run my cloudflare worker serverless function, during development?
我设法使用无服务器框架部署了我的第一个 cloudflare worker
https://serverless.com/framework/docs/providers/cloudflare/guide/
当我击中云时它正在工作。
在开发期间,希望能够在 http://localhost:8080/*
上进行测试
启动本地 HTTP 服务器并使用 serverless.yml 中指定的函数处理我的请求的最简单方法是什么?
我调查了 https://github.com/serverless/examples/tree/master/google-node-simple-http-endpoint
但是没有 "start" 脚本。
上似乎没有 cloudflare 的示例
目前无法在本地运行真正的Cloudflare Workers 运行时间。 Workers 团队知道开发人员需要这个,但需要做一些工作才能将核心 Workers 运行 时间与 Cloudflare 软件堆栈的其余部分分开,否则后者对于 运行 本地来说太复杂了。
同时,您可以尝试以下几个选项:
Third-party 模拟器
Cloudworker 是 Cloudflare Workers 的模拟器,运行 在本地位于 node.js 之上。它是由使用 Workers 的公司 Dollar Shave Club 的工程师构建的,而不是由 Cloudflare 构建的。由于它是 Workers 环境的完全独立实现,因此它的行为方式与 "real thing" 之间可能存在细微差别。但是,它足以完成一些工作。
预览服务API
在 cloudflareworkers.com 上看到的预览可以通过 API 访问。使用一些 curl
命令,您可以将代码上传到 cloudflareworkers.com 并对其进行 运行 测试。这并不是真正的 "local",但如果您始终连接到互联网,那几乎是一样的。您不需要任何特殊凭据即可使用此 API,因此您可以编写一些使用它的脚本 运行 单元测试等
上传名为 worker.js
的脚本 POST
将其上传到 https://cloudflareworkers.com/script
:
SCRIPT_ID=$(curl -sX POST https://cloudflareworkers.com/script \
-H "Content-Type: text/javascript" --data-binary @worker.js | \
jq -r .id)
现在 $SCRIPT_ID
将是一个 32 位十六进制数字,用于标识您的脚本。请注意,ID 基于哈希,因此如果您两次上传完全相同的脚本,您将获得相同的 ID。
接下来,生成一个随机的 session ID(32 个十六进制数字):
SESSION_ID=$(head -c 16 /dev/urandom | xxd -p)
重要的是这个 session ID 是加密随机的,因为任何拥有该 ID 的人都可以将开发工具连接到您的预览并调试它。
我们也定义两个配置:
PREVIEW_HOST=example.com
HTTPS=1
这些指定当您的工作人员 运行s 时,预览应该像 运行ning 在 https://example.com
上一样。传入请求的 URL 和 Host
header 将被重写为此协议和主机名。如果 URL 应该是 HTTPS,则设置 HTTPS=1
,如果不是,则设置 HTTPS=0
。
现在您可以像这样向您的工作人员发送请求:
curl https://00000000000000000000000000000000.cloudflareworkers.com \
-H "Cookie: __ew_fiddle_preview=$SCRIPT_ID$SESSION_ID$HTTPS$PREVIEW_HOST"
(32 个零可以是任何十六进制数字。在浏览器中使用预览时,这些是 randomly-generated 以防止 cookie 和缓存内容干扰 sessions。使用 curl 时,不过,这并不重要,所以 all-zero 没问题。)
您可以更改此 curl
行以在 URL 中包含路径,使用不同的方法(如 -X POST
),添加 header 等。只要显示主机名和 cookie,它就会转到您的预览工作器。
最后,你可以在Chrome中连接devtools控制台进行调试(不幸的是目前只能在Chrome中使用):
google-chrome https://cloudflareworkers.com/devtools/inspector.html?wss=cloudflareworkers.com/inspect/$SESSION_ID&v8only=true
请注意,上面的 API 目前没有正式记录,将来可能会更改,但更改应该相对容易通过在浏览器中打开 cloudflareworkers.com
并查看它提出的要求。
您也可以通过将 Cloudflare worker 加载为 service worker 来在本地进行测试。
注:
- 使用带 https: 的本地 Web 服务器。 Worker 不会使用 file: 或 http: 协议加载。
- 您的浏览器需要支持 workers,所以您不能使用 IE。
- 模拟任何 Cloudflare-specific 特征,例如 KV。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<!-- Service worker registration -->
<script>
if ('serviceWorker' in navigator) {
// Register the ServiceWorker
navigator.serviceWorker.register('/service-worker.js')
.then(
function(reg) {
// Registration succeeded
console.log('[registerServiceWorker] Registration succeeded. Scope is ' + reg.scope)
window.location.reload(true)
})
.catch(
function(error) {
// Registration failed
console.log('[registerServiceWorker] Registration failed with ' + error)
})
} else {
console.log('[registerServiceWorker] Service workers aren\'t supported')
}
</script>
</body>
</html>
Dollar Share Club 创建 Cloudworker。它没有得到积极维护,但它是在本地 运行 Cloudflare Workers 的一种方式。
您可以在 guest post 的 Cloudflare blog 上阅读 Cloudworker 的原始维护者的相关信息。
我设法使用无服务器框架部署了我的第一个 cloudflare worker https://serverless.com/framework/docs/providers/cloudflare/guide/ 当我击中云时它正在工作。
在开发期间,希望能够在 http://localhost:8080/*
上进行测试启动本地 HTTP 服务器并使用 serverless.yml 中指定的函数处理我的请求的最简单方法是什么?
我调查了 https://github.com/serverless/examples/tree/master/google-node-simple-http-endpoint 但是没有 "start" 脚本。
上似乎没有 cloudflare 的示例目前无法在本地运行真正的Cloudflare Workers 运行时间。 Workers 团队知道开发人员需要这个,但需要做一些工作才能将核心 Workers 运行 时间与 Cloudflare 软件堆栈的其余部分分开,否则后者对于 运行 本地来说太复杂了。
同时,您可以尝试以下几个选项:
Third-party 模拟器
Cloudworker 是 Cloudflare Workers 的模拟器,运行 在本地位于 node.js 之上。它是由使用 Workers 的公司 Dollar Shave Club 的工程师构建的,而不是由 Cloudflare 构建的。由于它是 Workers 环境的完全独立实现,因此它的行为方式与 "real thing" 之间可能存在细微差别。但是,它足以完成一些工作。
预览服务API
在 cloudflareworkers.com 上看到的预览可以通过 API 访问。使用一些 curl
命令,您可以将代码上传到 cloudflareworkers.com 并对其进行 运行 测试。这并不是真正的 "local",但如果您始终连接到互联网,那几乎是一样的。您不需要任何特殊凭据即可使用此 API,因此您可以编写一些使用它的脚本 运行 单元测试等
上传名为 worker.js
的脚本 POST
将其上传到 https://cloudflareworkers.com/script
:
SCRIPT_ID=$(curl -sX POST https://cloudflareworkers.com/script \
-H "Content-Type: text/javascript" --data-binary @worker.js | \
jq -r .id)
现在 $SCRIPT_ID
将是一个 32 位十六进制数字,用于标识您的脚本。请注意,ID 基于哈希,因此如果您两次上传完全相同的脚本,您将获得相同的 ID。
接下来,生成一个随机的 session ID(32 个十六进制数字):
SESSION_ID=$(head -c 16 /dev/urandom | xxd -p)
重要的是这个 session ID 是加密随机的,因为任何拥有该 ID 的人都可以将开发工具连接到您的预览并调试它。
我们也定义两个配置:
PREVIEW_HOST=example.com
HTTPS=1
这些指定当您的工作人员 运行s 时,预览应该像 运行ning 在 https://example.com
上一样。传入请求的 URL 和 Host
header 将被重写为此协议和主机名。如果 URL 应该是 HTTPS,则设置 HTTPS=1
,如果不是,则设置 HTTPS=0
。
现在您可以像这样向您的工作人员发送请求:
curl https://00000000000000000000000000000000.cloudflareworkers.com \
-H "Cookie: __ew_fiddle_preview=$SCRIPT_ID$SESSION_ID$HTTPS$PREVIEW_HOST"
(32 个零可以是任何十六进制数字。在浏览器中使用预览时,这些是 randomly-generated 以防止 cookie 和缓存内容干扰 sessions。使用 curl 时,不过,这并不重要,所以 all-zero 没问题。)
您可以更改此 curl
行以在 URL 中包含路径,使用不同的方法(如 -X POST
),添加 header 等。只要显示主机名和 cookie,它就会转到您的预览工作器。
最后,你可以在Chrome中连接devtools控制台进行调试(不幸的是目前只能在Chrome中使用):
google-chrome https://cloudflareworkers.com/devtools/inspector.html?wss=cloudflareworkers.com/inspect/$SESSION_ID&v8only=true
请注意,上面的 API 目前没有正式记录,将来可能会更改,但更改应该相对容易通过在浏览器中打开 cloudflareworkers.com
并查看它提出的要求。
您也可以通过将 Cloudflare worker 加载为 service worker 来在本地进行测试。
注:
- 使用带 https: 的本地 Web 服务器。 Worker 不会使用 file: 或 http: 协议加载。
- 您的浏览器需要支持 workers,所以您不能使用 IE。
- 模拟任何 Cloudflare-specific 特征,例如 KV。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<!-- Service worker registration -->
<script>
if ('serviceWorker' in navigator) {
// Register the ServiceWorker
navigator.serviceWorker.register('/service-worker.js')
.then(
function(reg) {
// Registration succeeded
console.log('[registerServiceWorker] Registration succeeded. Scope is ' + reg.scope)
window.location.reload(true)
})
.catch(
function(error) {
// Registration failed
console.log('[registerServiceWorker] Registration failed with ' + error)
})
} else {
console.log('[registerServiceWorker] Service workers aren\'t supported')
}
</script>
</body>
</html>
Dollar Share Club 创建 Cloudworker。它没有得到积极维护,但它是在本地 运行 Cloudflare Workers 的一种方式。
您可以在 guest post 的 Cloudflare blog 上阅读 Cloudworker 的原始维护者的相关信息。