Feathersã¯ãã§ã«ã¯ã©ã€ã¢ã³ãã«äŸåããªãã©ã€ãã©ãªã§åäœããããã«ãªã£ãããïŒhttps://github.com/feathersjs/feathers/pull/193ãåç §ïŒããµãŒããŒã®ããŒãäŸåé¢ä¿ãšããŠExpressã¯å¿ èŠãããŸããã 代ããã«ãä»ã®ãã©ã°ã€ã³ãšåãããã«æ§æã§ããExpressãKoaãããã³å Žåã«ãã£ãŠã¯Hapiçšã«åå¥ã®ã¢ãžã¥ãŒã«ãäœæã§ããŸãã
Feathers 2ã¢ããªã±ãŒã·ã§ã³ããã®ã¢ããã°ã¬ãŒããå€æŽããå¯äžã®ããšã¯ã 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ã®ãµããŒãã¯æ°åç»å ŽããŸããïŒïŒ83ãšïŒ58ãåç §ïŒã ããã¯ãéåžžã«ãã䌌ãæ¹æ³ã§å®è¡ã§ããŸãã
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}!` });
}
});
ããã«å¯Ÿããæ倧ã®éå£ã¯èªèšŒã§ãããšæããŸããå ·äœçã«ã¯ããªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã®ãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ããæ¹æ³ãããã¹ããŒãããã«ãŠã§ã¢ãKoaãšã©ã®ããã«é£æºããããªã©ã§ãã
äžèŠãããšãã³ã¢ã§ã¯ããã»ã©æªãã¯ãããŸããã req
ãšres
$ã®ä»£ããã«ã httpsïŒ//github.com/rkusa/koa-passport-exampleãšctx
ã䜿çšããå¿
èŠããããŸãã Hapiã«ã€ããŠã¯ããããããŸããããHapiããµããŒãããããšã«å€ãã®äŸ¡å€ããããšã¯ç¢ºä¿¡ããŠããŸãããããã¯ãExpressãšäœãå€ããã¯ãããŸããã å°ãªããšãKoaã§ã¯ããžã§ãã¬ãŒã¿ãŒããµããŒãããŠããŸãã
IMHOãããæè»ã§ãã¬ãŒã ã¯ãŒã¯ã«çžãããªãããã«ãããå Žåã¯ãã«ãŒãã£ã³ã°ãã³ã³ãã³ãããŽã·ãšãŒã·ã§ã³ãªã©ã«ã¹ã¿ã³ãã¢ãã³ã¢ãžã¥ãŒã«ã䜿çšããæ¹ãããããè¯ãã§ãããã
Koaã§ã®ãœã±ãããµããŒãã«ã€ããŠã¯ããããã€ã³ã¹ãã¬ãŒã·ã§ã³ã«äœ¿çšããŸãïŒ httpsïŒ//github.com/koajs/koa.ioã
IMHOãããæè»ã§ãã¬ãŒã ã¯ãŒã¯ã«çžãããªãããã«ãããå Žåã¯ãã«ãŒãã£ã³ã°ãã³ã³ãã³ãããŽã·ãšãŒã·ã§ã³ãªã©ã«ã¹ã¿ã³ãã¢ãã³ã¢ãžã¥ãŒã«ã䜿çšããæ¹ãããããè¯ãã§ãããã
http-framework
ïŒ ïŒãŠã£ã³ã¯ïŒ
@ahdinosauryaããã¯ç§èŠã«è¡ãããæ£ããæ¹æ³ã®ããã«èŠããŸãã
Feathersããã¬ãŒã ã¯ãŒã¯ã§ã¯ãªãã©ã€ãã©ãªã«ããå¿ èŠããããšæããŸããããã«ããããã©ã³ã¹ããŒãããã®ç¬ç«æ§ãé«ãŸããŸãã
äŸïŒ
const feathersApp = feathers().configure(rest());
feathersApp.service('todos', new NeDB('todos'));
export default feathersApp;
ã³ã¢
import feathersApp from './feathersApp';
import Koa from 'koa';
import adapter from 'feathers-koa';
const app = new Koa();
app.use(adapter(feathersApp));
ç¹æ¥
import feathersApp from './feathersApp';
import express from 'express';
import adapter from 'feathers-express';
const app = express();
app.use(adapter(feathersApp));
åºæ¬çã«ãã¢ããã¿ãŒã¯ç¹å®ã®ãã¬ãŒã ã¯ãŒã¯çšã®ããã«ãŠã§ã¢ãäœæããŸãã
æ³šïŒ https ïŒ//github.com/spirit-js/spirit
@daffl粟ç¥ããã§ãã¯ãããšããããšãŠããããã«èŠããŸãã ãšã¯ã¹ãã¬ã¹ãããã§ã¶ãŒãåãé¢ãã®ã¯çŽ æŽãããããšã§ãã ãšã¯ã¹ãã¬ã¹ãšã¯ç°ãªãéåžžã«å€ãã®æ°ããå®è£ ãå°é ããŠãããããå°æ¥çã«ã¯ãã§ã¶ãŒãããå ç¢ã«ãªããŸãã ããã«é¢ãã決å®ã¯ãããŸããïŒ
ãã®èªèšŒPRhttpsïŒ//github.com/feathersjs/feathers-authentication/pull/336ã¯ããã®äžã«ããããŸããŸãªãã¬ãŒã ã¯ãŒã¯ããµããŒãã§ããããã«ããããã«å¿ èŠãªå¯äžã®äž»èŠãªéšåã§ããå¿ èŠããããŸãã
ç§ã¯ããæ°æ¥ãããã«ã€ããŠãã£ãšå€ãã®ããšãèããŠããŸããããããŠä»ãç§ãã¡ã¯Aukã®æž ç®ã«è¿ã¥ããŠããã®ã§ããããBuzzardãªãªãŒã¹ã®äž»èŠãªç®æšã«ãªãã§ãããã 䜿çšæ°ãèŠãŠã¢ãžã¥ãŒã«åããã®ã¯çŽ æŽãããããšã§ãããExpressã¯ã©ãã«ãè¡ããŸããã æšå¹Žã®ããŠã³ããŒãæ°ã¯7000äžåã§ãKoaã¯140äžåãHapiã¯çŽ240äžåã§ãã
_ãããã®æ°å€ã¯ããã«ãã·ã¹ãã ãå±éé »åºŠãå±éã®ãµã€ãºãªã©ã«ãã£ãŠäººçºçã«èšããŸããããšãã§ãããšæããŸãããããã«ããã人æ°ã®ãããã®ã®æŠèŠãããããŸãã_
å®å šã«æ£çŽã«èšããšãæ°åãèŠããšãè¡šçŸãã以å€ã®ããšããµããŒãããã€ã³ã»ã³ãã£ãã¯ããŸããããŸããã ç§ãèŠãäž»ãªçç±ã¯æ¬¡ã®ãšããã§ãã
ç§ã®èãã§ã¯ãExpress以å€ã§ãµããŒãããæåã®ããšã³ãžã³ãã¯Koaã§ãããã ããã¯ãExpressãšèšèšãæãé¡äŒŒããŠãããå°æ¥ã®ES6 / ES7èšèªæ©èœãé©åã«ãµããŒãããŸãã ãããç§ãã¡ã®æãèŠæ±ãããŠããããã§ãã å人çã«ã¯ãrawããŒãã©ã€ãã©ãªããµããŒããããã®ã§ãããããã¯å€§å€ãªäœæ¥ã«ãªãå¯èœæ§ããããŸãã
[]äžè¬çãªãããã¬ãã«ã®FeathersAPIãç¹å®ããŸãã äžã«ããä»ã®ãšã³ãžã³ãå°ãªããšã1ã€è©ŠããŠã¿ããŸã§ããããå®å šã«ç¹å®ã§ãããšã¯æããŸããã ããããç§ã¯ããã次ã®ããã«ç°¡åã§ããããã«â€ïžããããšæããŸãïŒ
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);
ããã¯ã @ jeffijoeãææ¡ããŠãããã®ãšæŠå¿µçã«äŒŒãŠããŸãããFeathersã¢ããªãçŽæ¥æäœããŠãããšäººã ã«æããŠããããããšæããŸãã ããã¯ãªãŒã³ãªAPIã«ãªããšæããŸãã ãã ããããã¯èšã£ãŠãã倧éã®ã¡ãœãããã·ã ããå¿ èŠããããããããªãã®ã§ãäŒããã®ã¯å°ãæ©ãã§ãã ãããã¬ãã«ã®APIã決å®ããåã«ãããã«èª¿æ»ããå¿ èŠããããŸãã
app.get
app.set
app.render
app.send
app.json
req.accepts
req.xhr
ãã£ãšãããããããŸããã @dafflã¯ãç¹ã«ãœã±ãã/ã¬ã¹ãã®ã»ããã¢ããã«é¢ããŠãããè¯ãã¢ã€ãã¢ãæã£ãŠããã§ãããã
app
ãªããžã§ã¯ãã®ã©ã®ãã«ããŒã¡ãœãããã³ã¢FeathersAPIã®äžéšãšããŠä¿æããŸããã// or simply pass the engine. I like this best const koa = require('koa'); app.engine(koa);
åæããŸããïŒ ãã®ããã«ããŠã人ã ã¯ãã§ã¶ãŒãäžåºŠåŠç¿ããã¢ããã¿ãŒãåããä»»æã®ãµãŒããŒã«ãããã€ã§ããŸãã ããæ¡ïŒ
課é¡ã¯ãããããŒãªã©ã®æ¥ç¶åºæã®ãã®ã«äŸåããã©ã€ãã©ãªãå€æããããšã«ãããŸãã
人æ°ã³ã³ãã¹ãã«ã€ããŠãç§ãKoaã䜿ãããäž»ãªçç±ã¯ã人æ°ãããããã§ã¯ãªãïŒãšã¯ã¹ãã¬ã¹ã»ã©ã§ã¯ãªãïŒãããã«ãŠã§ã¢ãšã©ãŒã®åŠçã«é¢ããŠããå®å®ããŠããããã§ãã
Feathersããã·ã³APIã²ãŒããŠã§ã€ïŒã¯ã©ã·ãã¯WebãµãŒããŒïŒãšãã¹ã¿ã³ãã¢ãã³ã§ãããã€ã§ãããããã³ã«ã«äŸåãããé¢å¿ã®ããã¡ãã»ãŒãžãèãã ãã®æããª/ã·ã³ãã«ãªWebãµãŒãã¹ïŒã€ãŸãããã¹ããã©ã¯ãã£ã¹ã®ãã€ã¯ããµãŒãã¹ïŒã«é©ããã¢ãŒããã¯ãã£ã«ç§»è¡ããŠã¿ãŸãããããã¿ãŒã³ïŒã ãã®åŸãSenecaããã®ä»ã®äžè¬çãªNode.jsãã€ã¯ããµãŒãã¹ãã¬ãŒã ã¯ãŒã¯ãšã¹ã ãŒãºã«çµ±åãéå§ã§ããŸãã
ãããŠãã¯ããFeathersJSã¯ExpressãKoaãHapiãªã©ã«ãšããããªãã¯ãã§ã...
HTTP2 / Pushã䜿çšããNginxã§ãèŠããã§ã:)
幞ããªæ¥ã ïŒ
ãã®https://github.com/fastify/fastifyãèŠãããšããããŸããïŒ
FeathersJSã§äœ¿çšãããã®ã§ããããã®åé¡ã®ç¶æ³ã¯ã©ããªã£ãŠããŸããïŒ
@andreafalzettiã¯ãŸã åé²ããŠããŸãã ããã§é²è¡äžã®é²æç¶æ³ã確èªã§ããŸãïŒ https ïŒ//github.com/feathersjs/feathers-express/issues/3
ããã矜æ¯ãšçãå ·ãçµ±åããã®ã¯ãšãŠãçãã§ãããïŒ ãã£ãŠã¿ãŸããã ïŒïŒ
åºæ¬çãªçµ±åã¯ããªãç°¡åãªã¯ãã§ãããããã¯ç©äºãåä»ã«ãªãèªèšŒïŒç¹ã«ãã¹ããŒããšoAuthïŒã§ãã
ç§ãã¡ã®èšç»ã¯ãExpressãžã®åŒ·ãäŸåé¢ä¿ãåãé€ããv3以éãã©ã®çµ±åãæå³ããªããã調æ»ããããšã§ããã å é±Fastifyã«ã€ããŠã®è©±ãèŠãŸããããããã¯èå³æ·±ããã®ã§ããããFastifyãã¡ã€ã³ã®çµ±åãšããŠäœ¿çšããŠããã«ãŒã¿ãŒã§Nodes HTTPïŒããã³HTTP2ïŒïŒã䜿çšããæ¹ãFeathersã«ãšã£ãŠããã«çã«ããªã£ãŠãããããããŸããã
åèãŸã§ã«ã feathers-rest-koaã§ã®feathers-koaRESTçµ±åã®äœæ¥ãéå§ããŸãã
RESTã¯ã©ã€ã¢ã³ããå¥ã®ã¢ãžã¥ãŒã«/ããã±ãŒãžãšãªããžããªã«æœåºããã®ã¯çã«ããªã£ãŠãããšæããŸã;ïŒ
ã¯ã©ã€ã¢ã³ãã¯ãã§ã«https://github.com/feathersjs/feathers-rest-clientã«ãé¢é£ããŠããŸãïŒ https ïŒ//github.com/feathersjs/feathers-express/issues/3 by @christopherjbaker
Feathersã®åå¿è ãšããŠïŒ2018幎ãŸã§ã«ãFeathersã¯Expressããå®å šã«ç¬ç«ããŠããŸããïŒ
ç·šéïŒãŸãã¯èšãæãããšïŒãµããŒããããŠããä»ã®ãã¬ãŒã ã¯ãŒã¯ã KOAã¯å®å šã«ãµããŒããããŠããŸããïŒ
ããããšãïŒ ãã¬ãŒã ã¯ãŒã¯ã倧奜ãã§ãããŒãã¯ãŒã¯ã«æè¬ããŸãïŒ
@dafflã«èããŠãã ããã圌ã¯ããã«åãçµãã§ããŸã...ããããçŸåšã®ç¶æ³ã«ã€ããŠã¯ããããŸããã
Feathersã¯ãã¬ãŒã ã¯ãŒã¯ã«äŸåããŸããïŒããšãã°ã @ femalesjs / socketioã§ã®ã¿äœ¿çšããããä»ã®ãµãŒãã¹ãšéä¿¡ããããã®ã¹ã¿ã³ãã¢ãã³ã¯ã©ã€ã¢ã³ããšããŠã®ã¿äœ¿çšã§ããŸãïŒããExpressçšã®HTTP APIãã€ã³ãã£ã³ã°ïŒ @ femalesjs / expresså ïŒã®ã¿ããããŸãã
Feathersã®å šäœçãªãã€ã³ãã¯ãããã³ã«åºæã®ãã®ãæœè±¡åããããšãªã®ã§ãæçµçã«äœ¿çšããHTTPãã¬ãŒã ã¯ãŒã¯ã¯ããã»ã©éèŠã§ã¯ãªããExpressããé¢ããèªèšŒãªã©ãæœè±¡åããããšã¯ãããªã倧ããªã¿ã¹ã¯ã§ãïŒPassportã¯ãã¹ãŠExpressçšã«æ§ç¯ãããŠããŸããçŸåšã®Koaçµ±åã¯ããªã¯ãšã¹ããªããžã§ã¯ããããã£ãŠãExpressã®ããã«èŠããããšã§ããã®äºå®ãããã¯ããŸãã ç§ã«ãšã£ãŠã®æ°ãããã¬ãŒã ã¯ãŒã¯ãã€ã³ãã£ã³ã°ã®æåªå äºé ã¯ããã¬ãŒã³ããŒãHTTPã§ããããã¯ãæ°ãããµãŒãã¹ã«ãã¯ã¢ããã¡ã«ããºã ã䜿çšãããšãFastifyãšåæ§ã®ããã©ãŒãã³ã¹ãå®çŸããWebSocketæ¥ç¶ãããã«é«éåããŸãã
ãã®åé¡ã¯ãã¯ããŒãºãããåŸãæè¿ã®ã¢ã¯ãã£ããã£ããªããããèªåçã«ããã¯ãããŠããŸãã é¢é£ãããã°ã«ã€ããŠã¯ããã®åé¡ãžã®ãªã³ã¯ãå«ãæ°ããåé¡ãéããŠãã ããã
æãåèã«ãªãã³ã¡ã³ã
Feathersããã¬ãŒã ã¯ãŒã¯ã§ã¯ãªãã©ã€ãã©ãªã«ããå¿ èŠããããšæããŸããããã«ããããã©ã³ã¹ããŒãããã®ç¬ç«æ§ãé«ãŸããŸãã
äŸïŒ
å ±éã³ãŒã
ãã¬ãŒã ã¯ãŒã¯åºæ
ã³ã¢
ç¹æ¥
åºæ¬çã«ãã¢ããã¿ãŒã¯ç¹å®ã®ãã¬ãŒã ã¯ãŒã¯çšã®ããã«ãŠã§ã¢ãäœæããŸãã