4

我设法根据https://serverless.com/framework/docs/providers/cloudflare/guide/使用无服务器框架部署了我的第一个 cloudflare worker, 并且当我进入云时它正在工作。

在开发过程中,希望能够在http://localhost:8080/上进行测试*

使用 serverless.yml 中指定的函数启动本地 http 服务器并处理我的请求的最简单方法是什么?

我查看了https://github.com/serverless/examples/tree/master/google-node-simple-http-endpoint 但没有“开始”脚本。

https://github.com/serverless/上似乎没有 cloudflare 的示例

4

3 回答 3

5

目前,没有办法在本地运行真正的 Cloudflare Workers 运行时。Workers 团队知道开发人员需要这个,但是将核心 Workers 运行时与 Cloudflare 的其他软件堆栈分开需要一些工作,否则这太复杂而无法在本地运行。

与此同时,您可以尝试以下几个选项:

第三方模拟器

Cloudworker是在 node.js 上本地运行的 Cloudflare Workers 模拟器。它是由使用 Workers 的公司 Dollar Shave Club 的工程师建造的,而不是由 Cloudflare 建造的。由于它是 Workers 环境的完全独立实现,因此它的行为方式与“真实事物”之间可能存在细微差别。但是,完成一些工作就足够了。

预览服务 API

在cloudflareworkers.com上看到的预览可以通过 API 访问。使用一些curl命令,您可以将代码上传到 cloudflareworkers.com 并在其上运行测试。这不是真正的“本地”,但如果你总是连接到互联网,那几乎是一样的。您不需要任何特殊凭据即可使用此 API,因此您可以编写一些脚本来使用它来运行单元测试等。

worker.js将通过POSTing调用的脚本上传到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。

接下来,生成一个随机会话 ID(32 个十六进制数字):

SESSION_ID=$(head -c 16 /dev/urandom | xxd -p)

此会话 ID 必须是加密随机的,这一点很重要,因为任何拥有该 ID 的人都可以将 devtools 连接到您的预览版并对其进行调试。

让我们也定义两个配置:

PREVIEW_HOST=example.com
HTTPS=1

这些指定当您的工作人员运行时,预览应该像在https://example.com. 传入请求的 URL 和Host标头将被重写为此协议和主机名。设置HTTPS=1URL 是否应该是 HTTPS,或者HTTPS=0不是。

现在您可以向您的工作人员发送请求,例如:

curl https://00000000000000000000000000000000.cloudflareworkers.com \
  -H "Cookie: __ew_fiddle_preview=$SCRIPT_ID$SESSION_ID$HTTPS$PREVIEW_HOST"

(这 32 个零可以是任何十六进制数字。在浏览器中使用预览时,这些零是随机生成的,以防止 cookie 和缓存的内容在会话之间产生干扰。但是,当使用 curl 时,这无关紧要,所以全零没问题。)

您可以更改此curl行以在 URL 中包含路径、使用不同的方法(如-X POST)、添加标头等。只要主机名和 cookie 如图所示,它将转到您的预览工作人员。

最后,您可以连接 devtools 控制台在 Chrome 中进行调试(不幸的是,目前只能在 Chrome 中使用):

google-chrome https://cloudflareworkers.com/devtools/inspector.html?wss=cloudflareworkers.com/inspect/$SESSION_ID&v8only=true

cloudflareworkers.com请注意,上述 API 目前尚未正式记录,并且将来可能会更改,但是通过在浏览器中打开并查看它发出的请求,应该相对容易找出更改。

于 2018-12-23T22:25:40.090 回答
2

您还可以通过将 Cloudflare 工作人员加载为服务工作人员来进行本地测试。

笔记:

  • 使用带有 https: 的本地 Web 服务器。工作人员不会使用 file: 或 http: 协议加载。
  • 你的浏览器需要支持worker,所以你不能使用IE。
  • 模拟任何 Cloudflare 特定的功能,例如 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>

于 2019-07-05T02:28:11.930 回答
0

Dollar Share Club 创建了Cloudworker。它没有被积极维护,但它在本地运行 Cloudflare Workers 的一种方式。

您可以在Cloudflare 的博客中的 Cloudworker 原始维护者的客座文章中了解它。

于 2020-03-21T16:36:53.433 回答