将ReasonML函数部署到Google Cloud Functions

时间:2018-08-27 21:24:57

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

我正在尝试编写一个部署过程,以获取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将所需的所有内容打包到一个可以作为Google Cloud Function运行的index.js文件中,但是我不知道如何公开我的函数名以供GCP使用。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

将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捆绑程序,而是在bs-platform package.json部分中列出dependencies,以便在功能部署期间安装它,并{ 1 {}中的1}},以便部署使用提供的Express版本。

根据the reference,您可以随意命名模块文件,只要在express中用行peerDependencies列出名称即可。在此示例中,您可以将您的原因源文件命名为package.json

下一步是确保您的函数符合Express路由处理程序的外观。如果您会注意到,我链接的教程在JavaScript中显示了此函数形状:"main": "src/App.bs.js"。要将一个Reason函数编译为这种形状,我们需要一个 uncurried Reason函数:

src/App.re

(函数参数左括号后面的圆点表示它是未处理的函数。顺便说一句,我也将函数重新排列为惯用的Reason样式。)

最后,您部署:

exports.foo = (req, res) => ...;

let helloworld2 = (. _req, res) => { open Express; res |> Response.status(Response.StatusCode.Ok) |> Response.sendString("Hello world!") }; 告诉deploy命令在已部署的模块中运行哪个函数。