我正在尝试编写一个部署过程,以获取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(测试版)。
答案 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命令在已部署的模块中运行哪个函数。