Рубрики
Без рубрики

ELM на сервере (или где -либо еще) с обещаниями

ELM был создан для бега в браузере, но время от времени кто -то будет спрашивать о том, как запустить EL … Tagged with Elm, JavaScript.

ELM был создан для запуска в браузере, но время от времени кто -то будет спрашивать о том, как запустить ELM в среде сервера.

На моей нынешней работе нам нужно было синхронизировать несколько клиентов и сохранить где -то это общее состояние, поэтому мы подумали, что было бы неплохо, если сервер может действовать как другой клиент, который мог бы сохранить это состояние в централизованном месте.

Для этого мы создали сервер Node/Express для запуска нашего кода ELM, и сначала он был очень хакерским.

В серверной среде у вас в основном всегда есть запрос и ответ, связанный вместе. Вы просите что -то, и вы можете получить то, что просили или ошибку. Это не имеет значения, для каждого запроса есть ответ.

Но ELM не работает так, если вы хотите поговорить с внешним миром. Да, вы можете использовать порты Для внешнего общения, но порты следуют за моделью передачи сообщений актера. Таким образом, вопреки характеру запроса/ответа серверной связи, вы можете отправлять и получать только сообщения в ELM. Это может звучать как одно и то же, но это не так. Вы можете получить сообщение, не отправляя его в первую очередь. Или отправьте сообщение без необходимости ждать сообщения обратно. Вы можете отправить сообщение и получить несколько сообщений обратно и так далее. Между отправкой и получением сообщения нет связи, и это делает ELM вроде подходящей для серверного программного обеспечения, где связаны сообщения запроса/ответа.

После поиска лучших решений я наткнулся этот пост На форумах, где пользователь Joakin Сделал умное предложение: просто отправьте Ответ Объект со стороны JavaScript в порт и отправьте его обратно через другой порт, отвечая на то, что он запрашивал. Используйте объект ответа, чтобы отправить надлежащий ответ на правильного клиента, и вы пойдете. Вы можете увидеть пример этого На этом полезном репозитории Анкет

Это то, что я не знал: вы можете передать какое -либо значение JavaScript в качестве Json. Декодировать Значение Век, даже функции. Конечно, вы не можете многое сделать с ними внутри ELM, но в этом случае это помогает связать конкретный вызов функции к сообщению, которое мы отправим обратно.

Идея великолепна и помогает нам иметь какой -то тип связанного запроса/потока ответа. Проблема в том, когда нам нужно было проверить интеграцию. Было проще обойти все серверы и сосредоточиться на взаимодействии между узлом и ELM напрямую. Или, что еще хуже, если программное обеспечение, которое мы писали, вообще не было сервером Node/Express? Это когда мой босс и коллега Нейт предложил мы использовали обещания. Вместо того, чтобы отправлять объект ответа из Express в ELM, мы могли бы отправить функцию разрешения из обещания!

Я сделал вилку из примера приведенного выше с этими изменениями. Вы можете проверить это Здесь Анкет

На Вязостная сторона , ничего особенного не изменилось. Я только что внес несколько изменений на наименование, чтобы лучше отразить новую природу взаимодействия с кодом JavaScript. Но кроме этого нам не нужно было сильно менять, чтобы этот подход работал как предыдущий объект ответа, который был отправлен из Express, и новая функция решимости из обещания – это просто Json. Декодировать Значение s.

Настоящая магия на Код JavaScript . Это немного сложнее, но он отделяет код ELM и порты от самого Express, что позволяет использовать этот подход практически в любом месте. Вот тот, который заставляет все работать:

http
  .createServer((request, res) => {
    new Promise(resolve => app.ports.onRequest.send({ request, resolve }))
      .then(({ status, response }) => {
        res.statusCode = status;
        res.end(response);
      });
  })
  .listen(3000);

app.ports.resolve.subscribe(([{ resolve }, status, response]) => {
  resolve({ status, response });
});

Таким образом, можно использовать ELM на сервере, и я бы сказал, что с таким подходом, если вам нужен какой -то связанный запрос/интеграцию ответа, вы можете использовать ELM в любом месте, где вы можете использовать узел. Но это полезно? В нашем случае, когда мы хотели использовать большую часть кода от нашего клиента на сервере, это была полная победа, но я бы дважды подумал, если бы хотел построить полный сервер с ELM, поскольку в нем просто нет всего вещей Вам нужно будет сделать это хорошим развитием, хотя это было бы возможно.

Может ROC Будет язык, который мы будем использовать для таких случаев. Не могу дождаться этого!

Итак, что вы думаете об этом подходе? Вы сделали что -то подобное или совершенно отличное, чтобы решить одну и ту же проблему?

Спасибо за чтение!

Оригинал: “https://dev.to/eberfreitas/elm-in-the-server-or-anywhere-else-with-promises-5eoj”