在开发过程中如何在本地运行我的cloudflare worker无服务器功能?

时间:2018-12-23 07:10:30

标签: cloudflare serverless-framework serverless cloudflare-workers serverless-plugins

我设法使用无服务器框架部署了我的第一个cloudflare工作者 https://serverless.com/framework/docs/providers/cloudflare/guide/ 当我碰到云时它正在工作。

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

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

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

https://github.com/serverless/上似乎没有关于Cloudflare的示例

3 个答案:

答案 0 :(得分:2)

目前,没有办法在本地运行真正的Cloudflare Workers运行时。 Workers团队知道开发人员需要此功能,但是要将核心Workers运行时与Cloudflare其余软件堆栈区分开来要花一些工夫,否则,该软件栈太复杂了,无法在本地运行。

同时,您可以尝试以下几种选择:

第三方模拟器

Cloudworker是Cloudflare Workers的仿真器,它在node.js上本地运行。它是由Dollar Shave Club的工程师建造的,该公司使用的是Workers,而不是Cloudflare。由于它是Workers环境的整个独立实现,因此它的行为方式与“真实事物”之间可能会存在很小的差异。但是,它足以完成一些工作。

预览服务API

可以通过API访问cloudflareworkers.com上显示的预览。使用某些curl命令,您可以将代码上传到cloudflareworkers.com并在其上运行测试。这并不是真正的“本地”,但是如果您始终连接到Internet,则几乎是相同的。使用此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。

接下来,生成一个随机会话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,则设置HTTPS=1;否则,请设置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

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

>

答案 1 :(得分:0)

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

注意:

  • 使用带有https:的本地Web服务器。工作者将不会使用file:或http:协议进行加载。
  • 您的浏览器将需要支持工作人员,因此您无法使用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>

答案 2 :(得分:0)

美元共享俱乐部创建了Cloudworker。它没有得到积极维护,但是它是在本地运行Cloudflare Workers的一种方式。

您可以在Cloudworker的原始维护者在来宾帖子的Cloudflare blog上阅读有关内容。