Развертывание функции ReasonML в Google Cloud Functions

Я пытаюсь написать процесс развертывания для получения выходных данных 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, но я не знаю, как предоставить имя моей функции для использования GCP.

Я использую Node.js 8 (бета).


person Hadil Sabbagh    schedule 27.08.2018    source источник


Ответы (2)


Спасибо за информацию. Мой код опирался на bs-express, который на самом деле является слоем ReasonML над ExpressJS. Это было похоронено в моей папке node_modules, что приводило к сбою оператора require в сгенерированном файле .bs.js. Однако я скопировал зависимость в свой каталог src и отредактировал файл helloworld2.bs.js, чтобы указать на него, это сработало.

person Hadil Sabbagh    schedule 29.08.2018
comment
Ах, я вижу проблему, и это непросто. На данный момент у меня нет лучшего решения, чем вы - может, попробуйте на форуме Reason, если вам интересно? - person Yawar; 30.08.2018

Развертывание скомпилированного с помощью ReasonML модуля JavaScript в Google Cloud Functions во многом аналогично развертыванию модуля EcmaScript, поэтому хорошим руководством для понимания основ является https://cloud.google.com/functions/docs/tutorials/http#functions-update-install-gcloud-node8

Главное, что вам нужно убедиться, это то, что Reason выводит транспилированный модуль JavaScript, который выглядит так, как ожидает GCF. Однако я предвижу проблему с использованием Webpack, потому что он захочет упаковать вашу локальную версию Express в выходной JS, а мы этого не хотим - мы хотим использовать Express, предоставляемый GCF.

Чтобы обойти эту проблему, я бы, вероятно, не использовал сборщик JavaScript, а вместо этого перечислил бы bs-platform в разделе package.json dependencies, чтобы он устанавливался во время развертывания функции, и express в разделе peerDependencies, чтобы развертывание использовало предоставленную версию Express.

Согласно справочнику, вы можете назвать файл модуля, как вам нравится, пока вы указываете имя в package.json со строкой "main": "src/App.bs.js". В этом примере вы можете назвать исходный файл Reason src/App.re.

Следующий шаг - убедиться, что ваша функция соответствует тому, как должен выглядеть обработчик экспресс-маршрутизации. Если вы заметили, в руководстве, на которое я ссылаюсь, показана эта функция в 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 сообщает команде развертывания, какую функцию выполнять в развернутом модуле.

person Yawar    schedule 28.08.2018
comment
require("bs-express/src/Express.js") в src/helloworld2.bs.js приводит к сбою загрузки в Google. Не могли бы вы рассказать, как это обойти? Спасибо! - person Hadil Sabbagh; 29.08.2018
comment
Причина вышесказанного в том, что bs-express является библиотекой ReasonML и требует компиляции. Так что мне нужно взять его с собой ... - person Hadil Sabbagh; 29.08.2018