Иногда вам может потребоваться предоставить клиентам доступ к существующему API JavaScript и предоставить им доступ к API через вызовы функций, как на сервере. FOS (представленный в предыдущей статье) делает это. В этой статье я покажу вам, как использовать FOS с вашими существующими приложениями Express или Koa.
Сначала я подробно расскажу, почему не REST или JSON-RPC, а затем показаны две строки кода, необходимые для включения Express или Koa. Помимо этого, вы можете раскрыть свои API с помощью одной строки кода для каждой функции. Если у вас есть объект, на котором уже есть функции, вы можете просто передать его не более чем за две строки кода!
В этой статье не будут подробно рассказываться о плюсах и минусах подходов на основе REST и RPC. В сети есть много статей об этом, только Google.
Почему не REST или JSON-RPC
JSON-RPC - прекрасный, простой протокол промышленного стандарта. REST несколько сложнее, но очень полезен для деятельности, ориентированной на данные. Я не пошел ни по одному пути, потому что просто хотел иметь возможность раскрыть уже существующий, четко определенный и понятный API без необходимости создавать кучу написанного вручную кода оболочки, совершенно новый набор документации, сборку объемы модульных тестов или рискуете изменить семантику API в процессе сопоставления / упаковки. Короче говоря, я хотел быть эффективным для себя и других. FOS делает это за исключением двух вещей:
- Функции, предоставляемые клиентам, в некоторой степени неизбежно асинхронны.
- Ошибки несколько похоронены от клиентов. FOS в настоящее время находится в состоянии АЛЬФА, и это будет рассмотрено в следующем выпуске, где ошибки будут необязательно возвращаться клиенту и выдаваться точно так же, как они были на сервере (со стеком вызовов или без него).
FOS даже обрабатывает такие надоедливые значения, которые не поддерживаются JSON: Infinity
, NaN
и undefined
. Это даже позволит функциям сервера возвращать клиентам другие функции.
Включение Express и KOA
Примеры кажутся здесь лучшими. Приведенный ниже FOS просто отображает значение после его заключения в верхний регистр.
const express = require('express'), fosify = require("../index.js").fosify, app = express(); fosify(app, {echo:arg => arg,upper:arg => arg.toUpperCase()}, // permit running on any client // mount the functions on the variable F {allow:"*",name:"F"}); app.use(express.static(__dirname + "/")); app.listen(3000, () => console.log("Express FOS listening on 3000"))
or
const Koa = require('koa'), fosify = require("../index.js").fosify, app = new Koa(); app.use(require('koa-static')(__dirname + "/")); fosify(app, {echo:arg => arg,upper:arg => arg.toUpperCase()}, {allow:"*",name:"F"}); app.listen(3000,() => console.log("Koa FOS listening on 3000"));
Приведенный ниже HTML-файл загрузит клиент FOS и вызовет функцию сервера:
<html> <head> <script src="http://localhost:3000/fos"></script> </head> <body> <script> F.echo("a").then(result => alert(result)); </script> </body> </html>
Итак, две строки кода - это оператор import
и вызов fosify
для приложения Express или Koa. По сути, это просто добавляет в приложение специальный маршрут. Остальная часть кода зависит от вас. Вы можете добавить столько функций, сколько захотите, к объекту, который является вторым аргументом fosify
. Полная подпись:
fosify(app,functions,{allow,name,before,after,done}={})
app - Приложение Express или Koa
функции - объект, ключевые имена которого являются именами функций, а значения - функциями. Вложенные объекты хороши, и на клиенте можно использовать точечную нотацию. Если у вас есть объект, на котором уже есть функции, вы можете просто передать его!
allow - обеспечивает те же функции, что и заголовок allow в HTTP-запросах.
name - имя используемой переменной на стороне клиента. Также возможно обслуживание функций анонимным образом, как описано в GitHub README.md.
до, после и готово - также см. README.md.
Заворачивать
Надеюсь, вы понимаете ценность FOS. Это значительно ускорило некоторые мои усилия по написанию кода. Похлопайте эту статью, если считаете, что она может сделать то же самое для вас.