【问题标题】:Deploying a ReasonML function to Google Cloud Functions将 ReasonML 函数部署到 Google Cloud Functions
【发布时间】:2018-08-27 21:24:57
【问题描述】:

我正在尝试编写一个部署流程,以获取 ReasonML .bs.js 输出并将其部署为 Google Cloud 功能。

这是 ReasonML 代码:

/*!
 * My first ReasonML Google cloud function.
 * Hadil G. Sabbagh
 */
open Express;

let helloworld2 = (req: Request.t) => (res: Response.t) => {
        Response.status(Response.StatusCode.Ok, res) |> 
Response.sendString("Hello world!");
};

我已经成功构建了一个helloworld2.bs.js 文件。我一直在尝试使用 webpack 将所需的所有内容打包到 index.js 文件中,我可以将其作为 Google Cloud Function 运行,但我不知道如何公开我的函数名称以供 GCP 使用。

我正在使用 Node.js 8(测试版)。

【问题讨论】:

    标签: node.js google-cloud-functions reason bucklescript


    【解决方案1】:

    感谢您的信息。我的代码依赖于bs-express,它实际上是ExpressJS 之上的一个 ReasonML 层。这被埋在我的node_modules 文件夹中,导致生成的.bs.js 文件中的require 语句失败。但是,我将依赖项复制到我的src 目录中并编辑了helloworld2.bs.js 文件以指向它,它起作用了。

    【讨论】:

    • 啊,我明白了问题所在,这很棘手。在这一点上,我没有比你更好的解决方案了——如果你有兴趣,不妨试试 Reason 论坛?
    【解决方案2】:

    将 ReasonML 编译的 JavaScript 模块部署到 Google Cloud Functions 与部署 EcmaScript 模块大致相同,因此了解基础知识的好教程是 https://cloud.google.com/functions/docs/tutorials/http#functions-update-install-gcloud-node8

    您需要确保的主要事情是,Reason 会输出一个看起来像 GCF 期望的已转译的 JavaScript 模块。但是,我确实预见到使用 Webpack 会出现问题,因为它会希望将本地版本的 Express 打包到输出 JS 中,而我们不希望这样——我们希望使用 GCF 提供的 Express。

    为了解决这个问题,我可能不会使用 JavaScript 捆绑器,而是在 package.json dependencies 部分列出 bs-platform 以便在函数部署期间安装它,并在 peerDependencies 中安装 express部分,以便部署使用提供的 Express 版本。

    根据the reference,您可以随意命名模块文件,只要您在package.json 中列出名称,并带有"main": "src/App.bs.js" 行。在此示例中,您可以将原因源文件命名为 src/App.re

    下一步是确保您的函数符合 Express 路由处理程序的外观。如果您注意到,我链接的教程在 JavaScript 中显示了这个函数形状:exports.foo = (req, res) => ...;。要将 Reason 函数编译成这个形状,我们需要一个 uncurried Reason 函数:

    let helloworld2 = (. _req, res) => {
      open Express;
    
      res
      |> Response.status(Response.StatusCode.Ok)
      |> Response.sendString("Hello world!")
    };
    

    (函数参数左括号后面的点表示它是一个非柯里化函数。顺便说一句,我还将该函数重新排列为更惯用的 Reason 样式。)

    最后,你部署:

    gcloud beta functions deploy helloworld2 --runtime nodejs8 --trigger-http
    

    helloworld2 告诉部署命令在部署的模块中运行哪个函数。

    【讨论】:

    • require("bs-express/src/Express.js") 中的 src/helloworld2.bs.js 导致向 Google 加载失败。你能详细说明如何解决这个问题吗?谢谢!
    • 出现上述原因是因为bs-express是一个ReasonML库,需要编译。所以我需要随身携带...
    猜你喜欢
    • 2019-06-11
    • 2019-10-06
    • 2020-11-03
    • 1970-01-01
    • 2018-05-18
    • 2023-04-07
    • 2022-07-28
    • 2021-03-09
    • 2019-09-23
    相关资源
    最近更新 更多