Agora que o Feathers já funciona independente da biblioteca no cliente (consulte https://github.com/feathersjs/feathers/pull/193), também não precisamos mais do Express como dependência rígida para o servidor. Em vez disso, podemos criar módulos separados para Express, Koa e potencialmente Hapi que podem ser configurados como qualquer outro plugin:
A única coisa para mudar a atualização de um aplicativo Feathers 2 seria para app.configure(express())
:
const feathers = require('feathers');
const express = require('feathers-express');
const app = feathers()
// Make this app Express compatible
.configure(express())
// Configure REST API that uses Express
.configure(express.rest());
// Use any Express middleware
app.use(bodyParser.json());
// Use Feathers services normally
app.use('/todos', {
get(id) {
return Promise.resolve({ id, description: `You have to do ${id}!` });
}
});
O suporte Koa surgiu várias vezes (veja #83 e #58). Isso agora pode ser feito de maneira muito semelhante:
const feathers = require('feathers');
const koa = require('feathers-koa');
const app = feathers()
// Make this app Koa compatible
.configure(koa())
// Configure Koa REST handler
.configure(koa.rest());
// Use normal Koa middleware
app.use(function *(){
this.body = 'Hello World';
});
// Use a Feathers service through app.service
app.service('/todos', {
get(id) {
return Promise.resolve({ id, description: `You have to do ${id}!` });
}
});
A maior barreira para isso eu acho que será a autenticação, especificamente como temos acesso ao objeto de solicitação e resposta e como o middleware de passaporte funciona com Koa, etc.
De relance, não parece tão ruim com Koa. Só precisaríamos usar https://github.com/rkusa/koa-passport-example e ctx
em vez de req
e res
. Com o Hapi, não tenho tanta certeza, mas não estou convencido de que haja muito valor em apoiar o Hapi, ele realmente não oferece nada diferente do Express. Pelo menos com o Koa você tem suporte ao gerador.
IMHO, se queremos ser mais flexíveis e não vinculados a uma estrutura, provavelmente é melhor usar módulos autônomos para roteamento, negociação de conteúdo etc.
Para suporte de soquete com Koa, usamos isso como inspiração: https://github.com/koajs/koa.io.
IMHO, se queremos ser mais flexíveis e não vinculados a uma estrutura, provavelmente é melhor usar módulos autônomos para roteamento, negociação de conteúdo etc.
http-framework
! :piscar:
@ahdinosaur ya que parece mais o caminho certo para ir IMHO.
Acho que devemos fazer do Feathers uma biblioteca em vez de uma estrutura - isso também o tornaria mais independente do transporte.
Exemplos:
const feathersApp = feathers().configure(rest());
feathersApp.service('todos', new NeDB('todos'));
export default feathersApp;
Koa
import feathersApp from './feathersApp';
import Koa from 'koa';
import adapter from 'feathers-koa';
const app = new Koa();
app.use(adapter(feathersApp));
Expressar
import feathersApp from './feathersApp';
import express from 'express';
import adapter from 'feathers-express';
const app = express();
app.use(adapter(feathersApp));
Basicamente, os adaptadores criarão o middleware para sua estrutura específica.
@daffl Acabei de verificar o espírito e parece muito legal. Seria incrível dissociar as penas do expresso. Com o surgimento de tantas novas implementações diferentes do expresso, isso tornaria as penas mais robustas no futuro. Alguma decisão sobre isso?
Este PR de autenticação https://github.com/feathersjs/feathers-authentication/pull/336 deve ser a única peça importante que precisamos para poder suportar diferentes estruturas abaixo.
Eu tenho pensado muito mais sobre isso nos últimos dias e agora que estamos chegando perto de encerrar o Auk, esse será o principal objetivo do lançamento do Buzzard. Por mais legal que seja ser modular olhando para os números de uso, o Express não vai a lugar nenhum. Tem 70 milhões de downloads no ano passado , Koa está lá em cima com 1,4 milhões e Hapi com ~ 2,4 milhões .
_Acho que esses números podem ser inflados artificialmente por sistemas de compilação, frequência de implantação, tamanho de implantações etc., mas isso dá uma ideia geral de como as coisas são populares._
Sendo completamente honesto, olhando para os números, não há muito incentivo para apoiar nada além do expresso. Os principais motivos que vejo seriam:
Na minha opinião, o primeiro "motor" a oferecer suporte além do Express seria o Koa. É o mais semelhante em design ao Express e oferece um bom suporte para futuras funções de linguagem ES6/ES7. Também parece ser o nosso mais pedido. Pessoalmente, prefiro ter suporte para bibliotecas de nós brutos, mas isso pode ser muito trabalhoso.
[ ] Identifique a API Feathers de nível superior comum. Acho que não podemos identificar isso completamente até tentarmos pelo menos um outro motor por baixo. No entanto, eu ❤️ que fosse tão fácil quanto:
const feathers = require('feathers');
const app = feathers();
// use by string name
app.engine('express');
// or pass the engine with string
const koa = require('koa');
app.engine('koa', koa);
// or simply pass the engine. I like this best
const koa = require('koa');
app.engine(koa);
Isso é conceitualmente semelhante ao que @jeffijoe estava sugerindo, no entanto, prefiro que as pessoas sintam que estão interagindo diretamente com um aplicativo Feathers. Eu acho que vai fazer para uma API mais limpa. No entanto, dito isso, é um pouco cedo para dizer, pois talvez tenhamos que corrigir uma tonelada de métodos. Mais investigações serão necessárias antes que possamos determinar a API de nível superior.
app.get
app.set
app.render
app.send
app.json
req.accepts
req.xhr
Pode haver mais coisas. @daffl teria uma ideia melhor, especificamente em torno da configuração do soquete/descanso.
app
você deseja manter como parte da API Feathers principal.// or simply pass the engine. I like this best const koa = require('koa'); app.engine(koa);
Acordado! Dessa forma, as pessoas podem aprender Feathers uma vez e implementar em qualquer servidor que tenha um adaptador. Boa ideia!
O desafio está em converter bibliotecas que dependem de coisas específicas de conexão, como cabeçalhos.
Sobre o concurso de popularidade, minha principal razão para querer usar o Koa não é porque é popular (não tanto quanto expresso), mas porque é mais estável em termos de tratamento de erros de middleware.
Por favor, vamos mover Feathers para uma arquitetura mais adequada para um gateway de API fino (servidor web clássico) e serviços web estúpidos/simples que podem ser implantados de forma independente e são independentes de protocolo, apenas ouvindo mensagens de interesse (ou seja, melhor prática Micro Service padronizar). Em seguida, podemos começar a integrar sem problemas com Seneca e outras estruturas populares de Micro Services Node.js.
E sim, FeathersJS deve ser agnóstico para Express, Koa, Hapi, o que for...
Eu adoraria vê-lo no Nginx com HTTP2/Push também :)
Dias felizes!
Vocês já viram isso https://github.com/fastify/fastify?
Eu adoraria usá-lo com FeathersJS, qual é o status deste problema?
@andreafalzetti segue em frente. Você pode ver algum progresso acontecendo aqui: https://github.com/feathersjs/feathers-express/issues/3
Pois é, seria super fofo integrar penas com fastify! Vamos fazer isso :)
A integração básica deve ser bastante direta, no entanto, é a autenticação (especificamente o passaporte e o oAuth) onde as coisas ficam complicadas.
Nosso plano era remover a dependência do Express e depois da v3 investigar quais integrações fazem sentido. Eu vi uma palestra no Fastify na semana passada e, embora tenha sido interessante, pode fazer ainda mais sentido para o Feathers usar apenas Nodes HTTP (e HTTP2!) com o roteador que Fastify está usando como a integração principal.
Para sua informação, comecei a trabalhar na integração REST feathers-koa em feathers-rest-koa
Acho que faria sentido extrair o cliente REST em um módulo/pacote e repositório separados;)
Os clientes já estão em https://github.com/feathersjs/feathers-rest-client também relacionados: https://github.com/feathersjs/feathers-express/issues/3 por @christopherjbaker
Como um novato no Feathers: Em 2018, o Feathers é completamente independente do Express?
EDIT: Ou em outras palavras: Quais outros frameworks são suportados. O KOA é totalmente suportado?
Obrigado! Ame o quadro e obrigado pelo trabalho duro!
Pergunte ao @daffl , ele está trabalhando nisso... Não tenho certeza sobre o estado atual das coisas.
O Feathers é independente do framework (como você pode, por exemplo, usá-lo apenas com @feathersjs/socketio ou como um cliente autônomo para conversar com outros serviços), mas ele só possui ligações de API HTTP para Express (em @feathersjs/express ).
Como o objetivo do Feathers é abstrair as coisas específicas do protocolo, a estrutura HTTP que está usando não deve importar muito e abstrair coisas como autenticação do Express é uma tarefa muito grande (todo o Passport é construído para Express e até as integrações atuais do Koa apenas contornam esse fato mexendo com seu objeto de solicitação para torná-lo parecido com o Express). A prioridade mais alta para novas ligações de estrutura para mim seria HTTP de nó simples, que com um novo mecanismo de pesquisa de serviço produziria desempenho semelhante ao Fastify e tornaria as conexões de websocket ainda mais rápidas.
Este problema foi bloqueado automaticamente, pois não houve nenhuma atividade recente após o fechamento. Por favor, abra um novo problema com um link para este problema para bugs relacionados.
Comentários muito úteis
Acho que devemos fazer do Feathers uma biblioteca em vez de uma estrutura - isso também o tornaria mais independente do transporte.
Exemplos:
Código comum
Específico da estrutura
Koa
Expressar
Basicamente, os adaptadores criarão o middleware para sua estrutura específica.