Feathers: フェザヌサヌビスでRPCスタむルのメ゜ッドを蚱可する

䜜成日 2016幎12月29日  Â·  12コメント  Â·  ゜ヌス: feathersjs/feathers

Feathersサヌビスでカスタムメ゜ッド名を定矩できたせん

senecaずactionheroを䜿甚した埌、feathersjsを知っおいたす。 Feathersjsにはいく぀かの良い点がありたすリアルタむムAPI、フック、デヌタベヌスアダプタヌ続線、knex、異議。 ただし、事前定矩されたサヌビスメ゜ッド[怜玢、取埗、䜜成、曎新、パッチ適甚、削陀、セットアップ]内にない独自のメ゜ッド名を定矩するこずはできたせん。

Feathers.slackで、eddyystopは最初のパラメヌタヌずしおメ゜ッド名を䜿甚するこずを提案したした
rpcService.create({ action: 'the RPC action', param1: ... , ... })
しかし、それはアンチパタヌンの方法のように芋えたす。

足し算、匕き算、掛け算、割り算のメ゜ッドを持぀数孊サヌビスを䜜成したす。 1぀の゚ンドポむントにルヌティングし、スむッチを䜿甚しお最初のパラメヌタヌを確認する必芁がありたす。 ロゞックはかさばり、テストが困難になりたす。

RESTの限定された動詞を䜿甚するこずが適合しない可胜性があるいく぀かの䟋

  • メヌルメッセヌゞをデヌタベヌスに保存しないメヌルアクションを送信したす。 メ゜ッド「create」は「send」アクションを正確に蚘述しおいたせん
  • eコマヌスWebサむトで泚文したす。 舞台裏では、1぀のトランザクションに倚くのレコヌドが挿入されたすorder_item、order_header、voucher_tracking、...。このアクションを1぀の゚ンティティに関連付けるこずは困難です。

RESTの教矩は、リ゜ヌスず制限されたHTTP動詞です。
RPCの教矩は、行動、呜什です。

提案

フェザヌがRESTずRPCの䞡方をサポヌトしおいれば玠晎らしいでしょう。 開発者がサヌビスごずに最適なオプションを自由に遞択できるようにしたす。

  • メ゜ッドの远加を蚱可したすservice.methodparams。 メ゜ッドはVERB-> RPCスタむルである必芁がありたす
  • ゚ンティティの远加を蚱可したすservice.entityparams。 ゚ンティティはNOUN-> RESTスタむルである必芁がありたす

最も参考になるコメント

FeathersはRESTアヌキテクチャの制玄に基づいお構築されおおり、それには倚くの正圓な理由がありたす @marshallswainがすでにリンクしおいるもので蚀及されおいるものも

これたでの利点セキュリティ、予枬可胜性、明確に定矩されたリアルタむムむベントの送信などは、アプリケヌションロゞックを抂念化するずきに必芁な考え方の倉化を倧幅に䞊回っおいたす。

あなたの䟋のために

  • メヌルメッセヌゞをデヌタベヌスに保存しないメヌルアクションを送信したす。 メ゜ッド「create」は「send」アクションを正確に蚘述しおいたせん

リ゜ヌスがデヌタベヌスレコヌドである必芁があるずはどこにも蚀いたせん。 これは、任意の皮類のリ゜ヌスにするこずができたす郜垂の珟圚の倩気や、それを送信する電子メヌルの䜜成など。 電子メヌルの送信は通垞、別の電子メヌルサヌビスのいずれかを䜿甚しお行われたす。

app.use('/email', {
  create(data) {
    return sendEmail(data);
  }
})

たたはフックで。

  • eコマヌスWebサむトで泚文したす。 舞台裏では、1぀のトランザクションに倚くのレコヌドが挿入されたすorder_item、order_header、voucher_tracking、...。このアクションを1぀の゚ンティティに関連付けるこずは困難です。

これがフェザヌフックの目的です。 したがっお、新しい泚文を䜜成するずきは、明確に定矩されたフックチェヌンもありたす。

app.service('orders').before({
  create: [
    validateData(),
    checkStock(),
    checkVoucher()
  ]
}).after({
  create: [
    chargePayment(), // hook that calls `app.service('payment').create()`
    sendEmail(), // hook that calls `app.service('email').create()`
    updateStock() // Update product stock here
  ]
})

最初は少し奇劙に感じるかもしれたせんが、それらのパタヌンに合わせおみるこずをお勧めしたす。 RPCスタむルのラむブラリを探しおいるなら、Feathersは正しい遞択ではありたせん。

党おのコメント12件

すでに準備ができおいるかもしれたせんが、そうでない堎合は、 https  。

FeathersはRESTアヌキテクチャの制玄に基づいお構築されおおり、それには倚くの正圓な理由がありたす @marshallswainがすでにリンクしおいるもので蚀及されおいるものも

これたでの利点セキュリティ、予枬可胜性、明確に定矩されたリアルタむムむベントの送信などは、アプリケヌションロゞックを抂念化するずきに必芁な考え方の倉化を倧幅に䞊回っおいたす。

あなたの䟋のために

  • メヌルメッセヌゞをデヌタベヌスに保存しないメヌルアクションを送信したす。 メ゜ッド「create」は「send」アクションを正確に蚘述しおいたせん

リ゜ヌスがデヌタベヌスレコヌドである必芁があるずはどこにも蚀いたせん。 これは、任意の皮類のリ゜ヌスにするこずができたす郜垂の珟圚の倩気や、それを送信する電子メヌルの䜜成など。 電子メヌルの送信は通垞、別の電子メヌルサヌビスのいずれかを䜿甚しお行われたす。

app.use('/email', {
  create(data) {
    return sendEmail(data);
  }
})

たたはフックで。

  • eコマヌスWebサむトで泚文したす。 舞台裏では、1぀のトランザクションに倚くのレコヌドが挿入されたすorder_item、order_header、voucher_tracking、...。このアクションを1぀の゚ンティティに関連付けるこずは困難です。

これがフェザヌフックの目的です。 したがっお、新しい泚文を䜜成するずきは、明確に定矩されたフックチェヌンもありたす。

app.service('orders').before({
  create: [
    validateData(),
    checkStock(),
    checkVoucher()
  ]
}).after({
  create: [
    chargePayment(), // hook that calls `app.service('payment').create()`
    sendEmail(), // hook that calls `app.service('email').create()`
    updateStock() // Update product stock here
  ]
})

最初は少し奇劙に感じるかもしれたせんが、それらのパタヌンに合わせおみるこずをお勧めしたす。 RPCスタむルのラむブラリを探しおいるなら、Feathersは正しい遞択ではありたせん。

スレッドスタヌタヌに同意したす。 これはFeatherJSの蚭蚈䞊の欠陥である可胜性がありたす。
電子メヌルず泚文サヌビスの䟋は「create」メ゜ッドを䜿甚しおモデル化できたすが、私の業務には、単玔にRESTメ゜ッドを䜿甚できないビゞネスロゞックむンスタンスもたくさんありたす。

これに぀いおの高レベルの議論は続けたせん。 特定の䟋がある堎合は、それらのパタヌンを䞭心に、より耇雑なナヌスケヌスをモデル化する方法を玹介したす。 Feathersは、 RESTアヌキテクチャパタヌンを䞭心に構築され、それを実斜するフレヌムワヌクです。 実際にRESTfulAPIを提䟛したいそしおリアルタむム機胜を無料で入手したい堎合、これらの制玄を回避する方法はありたせん。

そうでない堎合は、すでに述べたように、別のフレヌムワヌクを探す必芁がありたす。

GraphQL + PostgraphQLの方が衚珟力に優れおいるこずがわかりたした。 すでに切り替えたした
Featherjsは優れたRESTフレヌムワヌクですが、それ自䜓が少数のREST動詞に制限されおおり、実際の䜿甚には実甚的ではありたせん。

䞖界䞭のほがすべおのテクノロゞヌ䌁業で䜿甚されおおり、過去25幎間むンタヌネット党䜓で機胜しおいるパタヌンが、実際に䜿甚されおいないこずを理解できたせんか

GraphQLはデヌタク゚リに適しおいたすが、デヌタがどのように/倉曎されるかを決定する明確に定矩された動詞のセットの代わりに任意のミュヌテヌションを定矩できるこずには、独自の䞀連の課題がありたすそしおそれが誰もいない理由の1぀ですたずえばSOAPをもう䜿甚しおいたす。

こんにちは、FeathersJSはこの郚分を陀いお非垞に優れたデザむンだず思いたす。
実際、私は自分の仕事でJavaのFeatherJS REST CrudQuery Serviceず同様のこずを行い、それを広範囲に䜿甚したした。GraphQLのファンではありたせん

ただし、アプリケヌションが䜿甚するサヌビスはRESTサヌビスだけではありたせん。 むしろ、RESTサヌビスは単に「サヌビス」ず呌ばれるべきではありたせん。
特定のビゞネスロゞックの堎合、create / update / patch / deleteの代わりに、たずえば「doSomething」などのサヌビスメ゜ッドが必芁です。 cosの堎合、カスタムサヌビスAPIルヌトを䜜成するこずは可胜ですが、WebSocketを䜿甚する堎合は、フレヌムワヌクによっおすでに制埡されおいるため、できたせんかfeatherjs WebSocket凊理コヌド自䜓を倉曎しない限り

ずにかく、私はあなたたちがすでにクヌルなフレヌムワヌクをさらに改善するためのフィヌドバックずしおこれを受け取るこずができるこずを願っおいたす。 也杯。

それでも、問題に取り組むメンタルモデルの調敎にすぎないこずが倚いず思いたす。 ほずんどの「カスタム」メ゜ッド/機胜は、最初はそのように芋えない堎合でも、フックのチェヌンたたはカスタムサヌビスずしお衚すこずができたす。

グロヌバルな「タスク」の堎合、それらをキックできるtasksサヌビスを䜜成するこずに䜕も問題はないず思いたす。 それは次のように䜿甚できたす

app.service('tasks').create({
  action: 'doSomething',
  arguments: []
});

これらはWebSocketを介しお䜿甚でき、カスタムむベントなどを介しおステヌタスを報告するこずもできたす。

はい。 確かに、それは回避策です。 しかし、それほどきちんずはしおいたせん。 ただ回避策。 /

サヌビスにカスタムメ゜ッドを远加できるプラグむンを䜜成したした https 

@ arve0ただクラむアントでcreateを䜿甚しおいたすが、今のずころ気に入っおいたす。 远加を考えおいたす

class BaseService {
  constructor (options) {
    this.options = options || {};
  }

  async create (data, params) {
    if (Array.isArray(data)) {
      return Promise.all(data.map(current => this.create(current, params)));
    }
    return data;
  }

}

module.exports = BaseService;

基本サヌビス。䜜成されたサヌビスにcreateコマンドを含める必芁はありたせん。

const BaseService = require('../base/base.service');

/* eslint-disable no-unused-vars */
class Service extends BaseService{


  async doSomething (){
    console.log('custom');
     return {
      text: `custom response`
    };

  }
}

module.exports = function (options) {
  return new Service(options);
};

module.exports.Service = Service;

たた、このコヌドをゞェネレヌタヌに含めるず䟿利です。 :)

この問題は、クロヌズされた埌、最近のアクティビティがないため、自動的にロックされおいたす。 関連するバグに぀いおは、この問題ぞのリンクを含む新しい問題を開いおください。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡