moleculer-web
O moleculer-web é o serviço oficial de API gateway para o framework Moleculer. Use-o para publicar seus serviços como APIs RESTful.
Funcionalidades
- suporta HTTP & HTTPS
- servidor de arquivos estáticos
- múltiplas rotas
- suporta middlewares, do tipo Connect, a nível global, a nível de rotas e a nível de alias.
- nomes de alias (com parâmetros nomeados & rotas REST)
- lista de permissões (allowlist)
- múltiplos body parsers (json, urlencoded)
- cabeçalhos CORS
- Limitador de taxa
- hooks antes & depois de chamadas
- Manipulação de buffer & fluxo
- modo middleware (use como um middleware com Express)
Experimente em seu navegador!
Instalação
npm i moleculer-web |
Utilização
Execute com configurações padrão
Este exemplo usa o serviço de API Gateway com configurações padrão. Você pode acessar todos os serviços (incluindo o interno $node.
) através de http://localhost:3000/
const { ServiceBroker } = require("moleculer"); |
Modelos de URLs:
Chame a ação
test.hello
:http://localhost:3000/test/hello
Chama a ação
math.add
com parâmetros:http://localhost:3000/math/add?a=25&b=13
Obter informação de saúde do nó:
http://localhost:3000/~node/health
Listar todas as ações:
http://localhost:3000/~node/actions
Lista de permissões (allowlist)
Se você não quiser publicar todas as ações, você pode filtrá-las com a opção allowlist. Use sequências de caracteres ou expressão regular na lista. Para ativar todas as ações, use "**"
item.
broker.createService({ |
Aliases
Você pode usar nomes de alias ao invés de nomes de ação. Você também pode especificar o método. Caso contrário, irá lidar com todos os tipos de métodos.
Usar parâmetros nomeados em aliases é possível. Parâmetros nomeados são definidos prefixando dois pontos ao nome do parâmetro (:name
).
broker.createService({ |
O parâmetro nomeado é manipulado com o módulo path-to-regexp. Portanto, você também pode usar parâmetros opcionais e repetidos.
Aliases ActionO API gateway implementa a ação
listAliases
que lista os endpoints HTTP para mapeamentos de ações.
Você também pode criar APIs RESTful.
broker.createService({ |
Para rotas REST você também pode usar este atalho simples:
broker.createService({ |
Para usar esse atalho abreviado, crie um serviço que tem as ações
list
,get
,create
,update
eremove
.
Você pode usar funções personalizadas dentro da declaração de aliases. Neste caso, a assinatura é a função (req, res) {...}
.
Por favor, note que Moleculer usa o servidor HTTP nativo do Node.js
broker.createService({ |
Há alguns ponteiros internos nos objetos
req
&res
:
req.$ctx
estão apontadas para o context da requisição.req.$service
&res.$service
apontam para esta instância do serviço.req.$route
&res.$route
estão apontados para a definição da rota resolvida.req.$params
é apontado para os parâmetros resolvidos (da string de consulta & corpo do post)req.$alias
está apontado para a definição de alias resolvido.req.$action
está apontado para a ação resolvida.req.$endpoint
foi apontado para o endpoint da ação resolvida.req.$next
é apontado para o manipuladornext()
se a solicitação vem do ExpressJS.Ex.: Para acessar o broker, use
req.$service.broker
.
Política de mapeamento
A rota
possui uma propriedade mappingPolicy
para manipular rotas sem aliases.
Opções disponíveis:
all
- habilitar para requisitar todas as rotas com ou sem aliases (padrão)restrict
- ativar para solicitar apenas as rotas com aliases.
broker.createService({ |
Você não pode solicitar /math.add
ou /math/add
URLs, apenas POST /add
.
Aliases para carregamento de arquivo
Api Gateway implementa upload de arquivos. Você pode fazer upload de arquivos como dados de um formulário (graças à biblioteca busboy) ou como corpo de requisição no formato raw. Em ambos os casos, o arquivo é transferido para uma ação como um Stream
. No modo de dados mutipart você pode fazer upload de vários arquivos também.
Exemplo
const ApiGateway = require("moleculer-web"); |
Parâmetros multipart
Para acessar os arquivos passados em formato multipart-form, esses campos específicos podem ser usados dentro da ação:
ctx.params
é a transmissão que contém o arquivo passado para o endpointctx.meta.$params
parâmetros da URL querystringctx.meta.$multipart
contém os campos de formulário adicional deve ser enviado antes de outros campos de arquivos.
Auto-alias
O auto-alias permite que você declare o alias de rota diretamente nos seus serviços. O gateway irá dinamicamente construir as rotas completas do esquema de serviço.
Gateway irá regerar as rotas sempre que um serviço entrar ou sair da rede.
Use o parâmetro whitelist
para especificar os serviços que o Gateway deve rastrear e construir as rotas.
Exemplo
// api.service.js |
// posts.service.js |
Aliases gerados
GET /api/hi => test.hello |
Parâmetros rest a nível de serviço
- fullPath, substitui todo o caminho gerado com um novo personalizado
- basePath, caminho para o serviço, por padrão, é aquele declarado em
settings.rest
- path, caminho para a ação
- method, método usado para acessar a ação
path é adicionado após o basePath A combinação path+basePath não é o mesmo que usar fullPath. Por exemplo:
// posts.service.js |
Irá criar esses endpoints:
GET /tags |
fullPath ignora o prefixo aplicado no API gateway!
O parâmetro rest pode ser também um array com elementos com a mesma estrutura discutida anteriormente. Isto pode ser aplicado tanto em configurações quanto no nível de ação. Por exemplo:
// posts.service.js |
Produz esses endpoints
GET /api/my/awesome/posts/:id/ => posts.get |
Parâmetros
O gateway API coleta parâmetros pela URL, parâmetros de requisição & corpo da requisição e os mescla. Os resultados são colocados na req.$params
.
Desativar mesclagem
Para desativar o mapeamento de parâmetros atribua mergeParams: false
nas configurações de rota. Neste caso, os parâmetros estarão separados.
Exemplo
broker.createService({ |
req.$params
não mesclada:
{ |
Parâmetros via URL
Mais informações: https://github.com/ljharb/qs
Array parameters URL: GET /api/opt-test?a=1&a=2
a: ["1", "2"] |
Objetos aninhados & arrays URL: GET /api/opt-test?foo[bar]=a&foo[bar]=b&foo[baz]=c
foo: { |
Middlewares
Suporta middlewares, do tipo Connect, a nível global, a nível de rotas & a nível de alias. Assinatura: function(req, res, next) {...}
. Para mais informações verifique middleware express
Exemplos
broker.createService({ |
Use swagger-stats para visualizar rapidamente a “saúde” da sua API (TypeScript)
import { Service, ServiceSchema } from "moleculer"; |
Middleware para tratamento de erros
Existe suporte para usar middlewares manipuladores de erro no gateway. Então, se você passar um Error
para a função next(err)
, ele chamará middlewares com a assinatura (err, req, res, next)
.
broker.createService({ |
Servidor de arquivos estáticos
Ele serve conteúdo com o módulo serve-static como o ExpressJS.
broker.createService({ |
Opções de chamada
O objeto route
possui uma propriedade callOptions
que é passada para broker.call
. Então você pode definir timeout
, retries
ou opções de fallbackResponse
para rotas. Leia mais sobre as opções de chamadas
Note que você também pode definir o tempo limite para uma ação diretamente na sua definição
broker.createService({ |
Múltiplas rotas
Você pode criar várias rotas com um prefixo diferente, allowlist, alias, opções de chamadas & autorização.
Ao usar várias rotas você deve definir explicitamente os body parsers para cada rota.
broker.createService({ |
Tipo de resposta & código de estado
Quando a resposta é recebida de um manipulador de ação, o gateway API detecta o tipo de resposta e define o Content-Type
nos cabeçalhos res
. O código de status é 200
por padrão. É claro que você pode substituir esses valores, além disso, você também pode definir cabeçalhos de resposta personalizados.
Para definir cabeçalhos de resposta & status código use os campos ctx.meta
:
Campos meta disponíveis:
ctx.meta.$statusCode
- atribuires.statusCode
.ctx.meta.$statusMessage
- atribuires.statusMessage
.ctx.meta.$responseType
- atribuiContent-Type
no cabeçalho.ctx.meta.$responseHeaders
- atribui chaves no cabeçalho.ctx.meta.$location
- atribuiLocation
no cabeçalho para redirecionamentos.
Exemplo
module.exports = { |
Autorização
Você pode implementar a autorização. Faça duas coisas para ativá-lo.
- Defina
authorization: true
em suas rotas - Defina o método
authorize
no serviço.
Exemplo de autorização
const E = require("moleculer-web").Errors; |
Você pode encontrar um exemplo de autorização JWT mais detalhado com base nesse exemplo completo.
Autenticação
Para habilitar o suporte para a autenticação, você precisa fazer algo semelhante ao que é descrito no parágrafo de autorização. Também neste caso você precisa:
- Defina
authentication: true
em suas rotas - Defina o seu método personalizado
authenticate
no seu serviço
O valor retornado será atribuído para a propriedade ctx.meta.user
. Você pode usá-lo em suas ações para obter a entidade de usuário logada.
Exemplo de autenticação
broker.createService({ |
Hooks de rotas
O objeto rote
tem hooks antes de & após chamadas. Você pode usá-lo para definir ctx.meta
, acessar req.headers
ou modificar os dados
de resposta.
broker.createService({ |
Nas versões anteriores do Moleculer Web, você não pode manipular os
dados
emonAfterCall
. Agora você pode, mas você deve sempre retornar osdados
novos ou originais.
Manipuladores de erros
Você pode adicionar manipuladores de erros personalizados a nível de rota & a nível global.
Nos manipuladores, você deve chamar
res.end
. Caso contrário, a requisição não será concluída.
broker.createService({ |
Formatador de erro
O gateway API implementa uma função auxiliar que formata o erro. Você pode usá-lo para filtrar os dados desnecessários.
broker.createService({ |
Cabeçalhos CORS
Você pode usar os cabeçalhos CORS no serviço Moleculer-Web.
Utilização
const svc = broker.createService({ |
Limitador de taxa
O Moleculer-Web tem um limitador de taxa integrado com armazenamento em memória.
Utilização
const svc = broker.createService({ |
Exemplo de armazenamento personalizado
class CustomStore { |
ETag
O valor da opção etag
pode ser false
, true
, weak
, strong
, ou uma Function
personalizada. Para obter detalhes verifique o código.
const ApiGateway = require("moleculer-web"); |
Função personalizada etag
module.exports = { |
Por favor, note que isso não funciona com respostas stream. Nesse caso, você deve gerar a tag etag
por si mesmo.
etag
personalizada para streaming
module.exports = { |
Servidor HTTP2
Gateway API fornece um suporte experimental para HTTP2. Você pode ativá-lo com http2: true
nas configurações do serviço. Exemplo
const ApiGateway = require("moleculer-web"); |
Uso de middleware ExpressJS
Você pode usar Moleculer-Web como um middleware em uma aplicação ExpressJS.
Utilização
const svc = broker.createService({ |
Configurações de serviço completo
Lista de todas as configurações de serviço Moleculer Web:
settings: { |
Métodos do Serviço
addRoute
Este método de serviço (this.addRoute(opts, toBottom = true)
) adiciona/substitui uma rota. Por exemplo, você pode chamá-lo de seus mixins para definir novas rotas (por exemplo, rota swager, rota graphql, etc.).
Por favor, note que se já existir uma rota este método irá substituir a configuração anterior da rota por uma nova.
removeRoute
O método de serviço remove a rota pelo caminho (this.removeRoute("/admin")
).
Exemplos
-
- gateway simples com configurações padrão.
-
- servidor open HTTPS
- manipulação de allowlist
-
- serve arquivos estáticos da pasta
assets
- allowlist
- aliases
- múltiplos body-parsers
- serve arquivos estáticos da pasta
-
- demonstração de autorização simples
- definir o usuário autorizado para
Context.meta
-
- servidor simples com aliases RESTful
- exemplo de
posts
com ações CRUD
-
- servidor web com Express
- use moleculer-web como um middleware
-
- iniciar servidor de websocket socket.io
- chama a ação e envia de volta a resposta via websocket
- enviar eventos Moleculer para o navegador via websocket
-
- SSL
- arquivos estáticos
- middlewares
- várias rotas com diferentes funções
- autorização baseada em JWT
- allowlist
- aliases com parâmetros nomeados
- múltiplos body-parsers
- hooks antes & depois
- métricas, estatísticas & validação com Moleculer
- manipuladores de erros personalizados
-
- Ambiente de desenvolvimento Webpack para desenvolvimento do lado do cliente
- arquivo de configuração webpack
- compactação
- servir de arquivo estático
-
- Ambiente de desenvolvimento Webpack+Vue para desenvolvimento VueJS no lado do cliente
- arquivo de configuração webpack
- Hot-replacement
- Babel, SASS, SCSS, Vue SFC