Jetzt, da Feathers bereits bibliotheksunabhängig auf dem Client arbeitet (siehe https://github.com/feathersjs/feathers/pull/193), brauchen wir Express auch nicht mehr wirklich als harte Abhängigkeit für den Server. Stattdessen können wir separate Module für Express, Koa und möglicherweise Hapi erstellen, die wie jedes andere Plugin konfiguriert werden können:
Das einzige, was das Upgrade von einer Feathers 2-Anwendung ändern könnte, wäre zu 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}!` });
}
});
Koa-Unterstützung kam mehrmals vor (siehe Nr. 83 und Nr. 58). Das geht jetzt ganz ähnlich:
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}!` });
}
});
Das größte Hindernis dafür wird meiner Meinung nach die Authentifizierung sein, insbesondere wie wir Zugriff auf das Anforderungs- und Antwortobjekt erhalten und wie die Passport-Middleware mit Koa funktioniert usw.
Auf den ersten Blick sieht es bei Koa gar nicht so schlecht aus. Wir müssten nur https://github.com/rkusa/koa-passport-example und ctx
anstelle von req
und res
verwenden. Bei Hapi bin ich mir nicht so sicher, aber ich bin nicht davon überzeugt, dass es viel Wert hat, Hapi zu unterstützen, es bietet nicht wirklich etwas anderes als Express. Zumindest bei Koa hat man Generatorunterstützung.
IMHO, wenn wir flexibler und nicht an ein Framework gebunden sein möchten, ist es wahrscheinlich besser, nur eigenständige Module für Routing, Inhaltsverhandlungen usw. zu verwenden.
Für die Socket-Unterstützung mit Koa verwenden wir dies als Inspiration: https://github.com/koajs/koa.io.
IMHO, wenn wir flexibler und nicht an ein Framework gebunden sein möchten, ist es wahrscheinlich besser, nur eigenständige Module für Routing, Inhaltsverhandlungen usw. zu verwenden.
http-framework
! :zwinkern:
@ahdinosaur ya, das sieht meiner Meinung nach eher nach dem richtigen Weg aus.
Ich denke, wir sollten Feathers zu einer Bibliothek statt zu einem Framework machen - das würde es auch unabhängiger vom Transport machen.
Beispiele:
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));
äußern
import feathersApp from './feathersApp';
import express from 'express';
import adapter from 'feathers-express';
const app = express();
app.use(adapter(feathersApp));
Grundsätzlich erstellen die Adapter die Middleware für ihr jeweiliges Framework.
Hinweis: https://github.com/spirit-js/spirit
@daffl Ich habe gerade Spirit überprüft und es sieht sehr ordentlich aus. Es wäre erstaunlich, Federn von Express zu entkoppeln. Mit dem Aufkommen so vieler neuer Implementierungen, die sich von Express unterscheiden, würden Federn in Zukunft robuster werden. Irgendwelche Entscheidungen dazu?
Diese Authentifizierungs-PR https://github.com/feathersjs/feathers-authentication/pull/336 sollte das einzige größere Stück sein, das wir benötigen, um verschiedene Frameworks darunter unterstützen zu können.
Ich habe in den letzten Tagen viel mehr darüber nachgedacht und jetzt, wo wir uns der Abwicklung von Auk nähern, wird dies das Hauptziel für die Veröffentlichung von Buzzard sein. So schön es ist, modular zu sein, wenn man sich die Nutzungszahlen ansieht, Express geht nirgendwo hin. Es hat im letzten Jahr 70 Millionen Downloads , Koa liegt mit 1,4 Millionen ganz oben und Hapi mit ~2,4 Millionen .
_Ich denke, diese Zahlen können durch Build-Systeme, Bereitstellungshäufigkeit, Größe der Bereitstellungen usw. künstlich aufgebläht werden, aber das gibt eine allgemeine Vorstellung davon, wie beliebt Dinge sind._
Um ganz ehrlich zu sein, wenn man sich die Zahlen ansieht, gibt es wirklich nicht viel Anreiz, etwas anderes als Express zu unterstützen. Die Hauptgründe, die ich sehe, wären:
Meiner Meinung nach wäre Koa die erste "Engine", die eine andere als Express unterstützt. Es ist Express im Design am ähnlichsten und bietet gute Unterstützung für zukünftige ES6/ES7-Sprachfunktionen. Es scheint auch unser am meisten nachgefragtes zu sein. Persönlich hätte ich lieber Unterstützung für Raw-Node-Bibliotheken, aber das könnte eine Menge Arbeit sein.
[ ] Identifizieren Sie die allgemeine Feathers-API der obersten Ebene. Ich glaube nicht, dass wir dies vollständig identifizieren können, bis wir mindestens einen anderen Motor darunter ausprobiert haben. Allerdings würde ich ❤️ es so einfach machen wie:
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);
Dies ähnelt konzeptionell dem, was @jeffijoe vorgeschlagen hat, aber ich würde es vorziehen, wenn die Leute das Gefühl haben, dass sie direkt mit einer Feathers-App interagieren. Ich denke, es wird für eine sauberere API sorgen. Davon abgesehen ist es jedoch noch etwas früh, um das zu sagen, da wir dann möglicherweise eine Menge Methoden anpassen müssen. Weitere Untersuchungen sind erforderlich, bevor wir die API der obersten Ebene bestimmen können.
app.get
app.set
app.render
app.send
app.json
req.accepts
req.xhr
Es könnten noch mehr Sachen sein. @daffl hätte eine bessere Idee, insbesondere in Bezug auf das Socket / Rest-Setup.
app
-Objekt möchten Sie als Teil der zentralen Feathers-API beibehalten.// or simply pass the engine. I like this best const koa = require('koa'); app.engine(koa);
Einverstanden! Auf diese Weise können Benutzer Feathers einmal lernen und auf jedem Server mit einem Adapter bereitstellen. Großartige Idee!
Die Herausforderung liegt in der Konvertierung von Bibliotheken, die auf verbindungsspezifischen Dingen wie Headern beruhen.
Was den Popularitätswettbewerb betrifft, so ist mein Hauptgrund, Koa zu verwenden, nicht, weil es beliebt ist (nicht so sehr wie Express), sondern weil es stabiler in Bezug auf die Behandlung von Middleware-Fehlern ist.
Bitte lassen Sie uns Feathers auf eine Architektur umstellen, die besser für ein dünnes API-Gateway (klassischer Webserver) und dumme/einfache Webdienste geeignet ist, die eigenständig bereitgestellt werden können und protokollunabhängig sind und nur Nachrichten von Interesse abhören (dh Best Practice Micro Service Muster). Dann können wir mit der reibungslosen Integration in Seneca und andere beliebte Node.js Micro Services-Frameworks beginnen.
Und ja, FeathersJS sollte gegenüber Express, Koa, Hapi, was auch immer ... agnostisch sein.
Ich würde es gerne auch auf Nginx mit HTTP2/Push sehen :)
Glückliche Tage!
Habt ihr das https://github.com/fastify/fastify gesehen?
Ich würde es gerne mit FeathersJS verwenden, wie ist der Status dieses Problems?
@andreafalzetti geht immer noch voran. Hier können Sie einige Fortschritte sehen: https://github.com/feathersjs/feathers-express/issues/3
Ja, wäre super süß, Federn mit Fastify zu integrieren! Lass es uns tun :)
Die grundlegende Integration sollte ziemlich einfach sein, aber bei der Authentifizierung (insbesondere Passport und oAuth) wird es schwierig.
Unser Plan war es, die harte Abhängigkeit von Express zu beseitigen und nach v3 zu untersuchen, welche Integrationen sinnvoll sind. Ich habe letzte Woche einen Vortrag über Fastify gesehen, und obwohl es interessant war, könnte es für Feathers noch sinnvoller sein, nur Nodes HTTP (und HTTP2!) Mit dem Router zu verwenden, den Fastify als Hauptintegration verwendet.
Zu Ihrer Information, ich habe mit der Arbeit an der REST-Integration von Feathers-Koa in Feathers-Rest-Koa begonnen
Ich denke, es wäre sinnvoll, den REST-Client in ein separates Modul/Paket und Repo zu extrahieren;)
Die Clients sind bereits unter https://github.com/feathersjs/feathers-rest-client ebenfalls bezogen: https://github.com/feathersjs/feathers-express/issues/3 von @christopherjbaker
Als Neuling bei Feathers: Bis 2018 ist Feathers komplett unabhängig von Express?
EDIT: Oder anders gesagt: Welche anderen Frameworks werden unterstützt? Wird KOA vollständig unterstützt?
Danke! Ich liebe das Framework und danke für die harte Arbeit!
Fragen Sie @daffl , er hat daran gearbeitet ... Bin mir aber nicht sicher über den aktuellen Stand der Dinge.
Feathers ist Framework-unabhängig (da Sie es zB nur mit @feathersjs/socketio oder als eigenständiger Client verwenden können, um mit anderen Diensten zu kommunizieren), aber es hat nur HTTP-API-Bindungen für Express (in @feathersjs/express ).
Da der springende Punkt von Feathers darin besteht, die protokollspezifischen Dinge zu abstrahieren, sollte das verwendete HTTP-Framework letztendlich keine so große Rolle spielen, und Dinge wie die Authentifizierung von Express weg zu abstrahieren, ist eine ziemlich große Aufgabe (Passport ist vollständig für Express und sogar die aktuellen Koa-Integrationen umgehen diese Tatsache einfach, indem sie mit ihrem Anforderungsobjekt herumspielen, damit es wie Express aussieht). Die höchste Priorität für neue Framework-Bindungen wäre für mich Plain Node HTTP, das mit einem neuen Service-Lookup-Mechanismus eine ähnliche Leistung wie Fastify erzielen und Websocket-Verbindungen noch schneller machen würde.
Dieses Problem wurde automatisch gesperrt, da es nach seiner Schließung keine Aktivitäten mehr gegeben hat. Bitte öffnen Sie ein neues Problem mit einem Link zu diesem Problem für verwandte Fehler.
Hilfreichster Kommentar
Ich denke, wir sollten Feathers zu einer Bibliothek statt zu einem Framework machen - das würde es auch unabhängiger vom Transport machen.
Beispiele:
Gemeinsamer Code
Framework-spezifisch
Koa
äußern
Grundsätzlich erstellen die Adapter die Middleware für ihr jeweiliges Framework.