μ΄μ 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μ μλνλ λ°©λ² λ±μ λλ€.
νλμ λ΄λ 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
! :λμ§:
@ahdinosaur λμ€μ IMHOλ‘ κ°λ μ¬λ°λ₯Έ λ°©λ²μ²λΌ 보μ λλ€.
λλ μ°λ¦¬κ° νλ μμν¬ λμ 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));
κΈ°λ³Έμ μΌλ‘ μ΄λν°λ νΉμ νλ μμν¬μ λν λ―Έλ€μ¨μ΄λ₯Ό μμ±ν©λλ€.
@daffl λ°©κΈ μ μ μ νμΈνλλ° λ§€μ° κΉλν΄ λ³΄μ λλ€. μ΅μ€νλ μ€μμ κΉνΈμ λΆλ¦¬νλ κ²μ λλΌμ΄ μΌμ λλ€. expressμ λ€λ₯Έ λ§μ μλ‘μ΄ κ΅¬νμ΄ μ¦κ°ν¨μ λ°λΌ ν₯ν νλκ° λμ± κ°λ ₯ν΄μ§ κ²μ λλ€. μ΄μ λν κ²°μ μ΄ μμ΅λκΉ?
μ΄ μΈμ¦ PR https://github.com/feathersjs/feathers-authentication/pull/336 μ μλμ μλ λ€λ₯Έ νλ μμν¬λ₯Ό μ§μνκΈ° μν΄ νμν μ μΌν μ£Όμ λΆλΆμ΄μ΄μΌ ν©λλ€.
λλ μ§λ λ©°μΉ λμ μ΄κ²μ λν΄ λ λ§μ μκ°μ νκ³ μ΄μ μ°λ¦¬κ° Aukλ₯Ό λ§λ¬΄λ¦¬νλ λ° κ°κΉμμ§κ³ μκΈ° λλ¬Έμ μ΄κ²μ΄ Buzzard 릴리μ€μ μ£Όμ λͺ©νκ° λ κ²μ λλ€. μ¬μ© μ«μλ₯Ό 보면 λͺ¨λμμΌλ‘ λμ΄ μλ λ§νΌ Expressλ μ무λ°λ κ°μ§ μμ΅λλ€. μλ μ 7000λ§ λ€μ΄λ‘λ λ₯Ό κΈ°λ‘νμΌλ©° Koaλ 140λ§ λ€μ΄λ‘λ, Hapiλ ~240λ§ λ€μ΄λ‘λλ₯Ό κΈ°λ‘νμ΅λλ€.
_μ΄ μμΉλ λΉλ μμ€ν , λ°°ν¬ λΉλ, λ°°ν¬ ν¬κΈ° λ±μ μν΄ μΈμμ μΌλ‘ λΆνλ €μ§ μ μλ€κ³ μκ°ν©λλ€.
μμ§ν λ§ν΄μ μ«μλ₯Ό 보면 νννλ κ² μΈμλ μ§μ§ν λκΈ°κ° λ³λ‘ μμ΅λλ€. λ΄κ° 보λ μ£Όμ μ΄μ λ λ€μκ³Ό κ°μ΅λλ€.
λ΄ μκ°μ Express μ΄μΈμ 첫 λ²μ§Έ "μμ§"μ KoaμΌ κ²μ λλ€. Expressμ λμμΈμ΄ κ°μ₯ μ μ¬νλ©° ν₯ν ES6/ES7 μΈμ΄ κΈ°λ₯μ λν νλ₯ν μ§μμ μ 곡ν©λλ€. λν κ°μ₯ λ§μ΄ μμ²νλ κ² κ°μ΅λλ€. κ°μΈμ μΌλ‘ μμ λ Έλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ§μνκ³ μΆμ§λ§ λ§μ μμ μ΄ νμν μ μμ΅λλ€.
[ ] κ³΅ν΅ μ΅μμ Feathers APIλ₯Ό μλ³ν©λλ€. λλ μ°λ¦¬κ° μλμμ μ μ΄λ νλμ λ€λ₯Έ μμ§μ μλν λκΉμ§ μ΄κ²μ μμ ν μλ³ν μ μλ€κ³ μκ°ν©λλ€. κ·Έλ¬λ λ€μκ³Ό κ°μ΄ μ½κ² β€οΈνκ³ μΆμ΅λλ€.
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
κ°μ²΄μ μ΄λ€ λμ°λ―Έ λ©μλλ₯Ό ν΅μ¬ Feathers APIμ μΌλΆλ‘ μ μ§νμκ² μ΅λκΉ?// or simply pass the engine. I like this best const koa = require('koa'); app.engine(koa);
λμ! μ΄λ° μμΌλ‘ μ¬λλ€μ Feathersλ₯Ό ν λ² λ°°μ°κ³ μ΄λν°κ° μλ λͺ¨λ μλ²μ λ°°ν¬ν μ μμ΅λλ€. μ’μ μμ΄λμ΄!
λ¬Έμ λ ν€λμ κ°μ μ°κ²° κ΄λ ¨ νλͺ©μ μμ‘΄νλ λΌμ΄λΈλ¬λ¦¬λ₯Ό λ³ννλ λ° μμ΅λλ€.
μΈκΈ°λ μ½ν μ€νΈμ λν΄ μ κ° Koaλ₯Ό μ¬μ©νκ³ μΆμ κ°μ₯ ν° μ΄μ λ μΈκΈ°κ° μκΈ° λλ¬Έμ΄ μλλΌ(μ΅μ€νλ μ€λ§νΌμ μλμ§λ§) λ―Έλ€μ¨μ΄ μ€λ₯λ₯Ό μ²λ¦¬νλ μΈ‘λ©΄μμ λ μμ μ μ΄κΈ° λλ¬Έμ λλ€.
μ¬ API κ²μ΄νΈμ¨μ΄(ν΄λμ μΉ μλ²)μ λ μ ν©ν μν€ν μ²λ‘ Feathersλ₯Ό μ΄λνκ³ λ 립 μ€ννμΌλ‘ λ°°ν¬ν μ μκ³ νλ‘ν μ½μ λ 립μ μ΄λ©° κ΄μ¬ μλ λ©μμ§(μ: λͺ¨λ² μ¬λ‘ Micro Service 무λ¬). κ·Έλ° λ€μ Seneca λ° κΈ°ν μΈκΈ° μλ Node.js Micro Services νλ μμν¬μ μννκ² ν΅ν©ν μ μμ΅λλ€.
κ·Έλ¦¬κ³ μ, FeathersJSλ Express, Koa, Hapi, 무μμ΄λ κ°μ λΆκ°μ§λ‘ μ μ΄μ΄μΌ ν©λλ€...
HTTP2/Pushκ° μλ Nginxμμλ λ³΄κ³ μΆμ΅λλ€. :)
ν볡ν λ λ€!
μ¬λ¬λΆ μ΄κ±° https://github.com/fastify/fastify λ³΄μ ¨λμ?
FeathersJSμ ν¨κ» μ¬μ©νκ³ μΆμ΅λλ€. μ΄ λ¬Έμ μ μνλ 무μμ λκΉ?
@andreafalzetti λ μ¬μ ν μ μ§νκ³ μμ΅λλ€. μ¬κΈ°μμ μ§ν μν©μ λ³Ό μ μμ΅λλ€: https://github.com/feathersjs/feathers-express/issues/3
μ, κΉνΈμ fastifyμ ν΅ν©νλ κ²μ λ§€μ° λ¬μ½€ν κ²μ λλ€! ν΄λ³΄μ :)
κΈ°λ³Έ ν΅ν©μ λ§€μ° κ°λ¨ν΄μΌ νμ§λ§ λ¬Έμ κ° λ°μνλ μΈμ¦(νΉν μ¬κΆ λ° oAuth)μ λλ€.
μ°λ¦¬μ κ³νμ Expressμ λν μ격ν μ’ μμ±μ μ κ±°νκ³ v3 μ΄ν ν΅ν©μ΄ μλ―Έ μλ κ²μ μ‘°μ¬νλ κ²μ΄μμ΅λλ€. μ§λ μ£Όμ Fastifyμ λν κ°μ°μ 보μλλ° ν₯λ―Έλ‘κΈ΄ νμ§λ§, Fastifyκ° μ£Όμ ν΅ν©μΌλ‘ μ¬μ©νκ³ μλ λΌμ°ν°μ ν¨κ» Feathersκ° λ Έλ HTTP(λ° HTTP2!)λ₯Ό μ¬μ©νλ κ²μ΄ ν¨μ¬ λ ν©λ¦¬μ μΌ μ μμ΅λλ€.
μ°Έκ³ λ‘ μ λ feather-rest-koa μμ feather-koa REST ν΅ν© μμ μ μμνμ΅λλ€.
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λ νλ μμν¬μ λ 립μ μ΄μ§λ§(μ: @feathersjs/socketio μ ν¨κ» μ¬μ©νκ±°λ λ€λ₯Έ μλΉμ€μ ν΅μ νκΈ° μν λ 립 μ€νν ν΄λΌμ΄μΈνΈλ‘λ§ μ¬μ©ν μ μμ) Expressμ λν HTTP API λ°μΈλ©λ§ μμ΅λλ€( @feathersjs/express ).
Feathersμ μμ μ νλ‘ν μ½ νΉμ μ¬νμ μΆμννλ κ²μ΄λ―λ‘ μ¬μ©νλ HTTP νλ μμν¬λ κΆκ·Ήμ μΌλ‘ κ·Έλ€μ§ μ€μνμ§ μμμΌ νλ©° Expressμμ μΈμ¦κ³Ό κ°μ κ²μ μΆμννλ κ²μ κ½€ ν° μμ μ λλ€(λͺ¨λ Passportλ Express λ° μ¬μ§μ΄ νμ¬ Koa ν΅ν©μ μμ² κ°μ²΄λ₯Ό μ¬μ©νμ¬ Expressμ²λΌ 보μ΄κ² νμ¬ ν΄λΉ μ¬μ€μ ν΄νΉν©λλ€. μλ‘μ΄ νλ μμν¬ λ°μΈλ©μ λν μ΅μ°μ μμλ μλ‘μ΄ μλΉμ€ μ‘°ν λ©μ»€λμ¦μ μ¬μ©νμ¬ Fastifyμ μ μ¬ν μ±λ₯μ μ 곡νκ³ μΉ μμΌ μ°κ²°μ ν¨μ¬ λ λΉ λ₯΄κ² λ§λλ μΌλ° λ Έλ HTTPμ λλ€.
μ΄ λ¬Έμ λ λ«ν ν μ΅κ·Ό νλμ΄ μμκΈ° λλ¬Έμ μλμΌλ‘ μ κ²Όμ΅λλ€. κ΄λ ¨ λ²κ·Έμ λν΄μλ μ΄ λ¬Έμ μ λν λ§ν¬κ° μλ μ λ¬Έμ λ₯Ό μ¬μμμ€.
κ°μ₯ μ μ©ν λκΈ
λλ μ°λ¦¬κ° νλ μμν¬ λμ Feathersλ₯Ό λΌμ΄λΈλ¬λ¦¬λ‘ λ§λ€μ΄μΌ νλ€κ³ μκ°ν©λλ€. κ·Έλ κ² νλ©΄ μ μ‘μμλ λ λ 립μ μ΄ λ κ²μ λλ€.
μ:
κ³΅ν΅ μ½λ
νλ μμν¬λ³
μ½μ
νννλ€
κΈ°λ³Έμ μΌλ‘ μ΄λν°λ νΉμ νλ μμν¬μ λν λ―Έλ€μ¨μ΄λ₯Ό μμ±ν©λλ€.