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/helloChama a ação
math.addcom parâmetros:http://localhost:3000/math/add?a=25&b=13Obter informação de saúde do nó:
http://localhost:3000/~node/healthListar 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
listAliasesque 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,updateeremove.
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.$ctxestão apontadas para o context da requisição.req.$service&res.$serviceapontam para esta instância do serviço.req.$route&res.$routeestã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.$aliasestá apontado para a definição de alias resolvido.req.$actionestá apontado para a ação resolvida.req.$endpointfoi 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.$paramsparâmetros da URL querystringctx.meta.$multipartconté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-Typeno cabeçalho.ctx.meta.$responseHeaders- atribui chaves no cabeçalho.ctx.meta.$location- atribuiLocationno cabeçalho para redirecionamentos.
Exemplo
module.exports = { |
Autorização
Você pode implementar a autorização. Faça duas coisas para ativá-lo.
- Defina
authorization: trueem suas rotas - Defina o método
authorizeno 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: trueem suas rotas - Defina o seu método personalizado
authenticateno 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
dadosemonAfterCall. Agora você pode, mas você deve sempre retornar osdadosnovos 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 etagpode 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
postscom 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