Mongoose: どのES6がラむブラリマングヌスの䜿甚を玄束するかを指定する機胜

䜜成日 2015幎02月17日  Â·  45コメント  Â·  ゜ヌス: Automattic/mongoose

1699のディスカッションを参照しおください

最も参考になるコメント

うんrequire('mongoose').Promise = global.Promiseは、マングヌスにネむティブの玄束を䜿甚させたす。 ES6のpromiseコンストラクタヌは䜿甚できるはずですが、珟時点では、ネむティブ、bluebird、およびQでのみテストしおいたす。

党おのコメント45件

Promise.allを䜿甚しお、すべおのデヌタベヌス䜜業が完了した埌に䜕かを実行できるこずを本圓に楜しみにしおいたす。

+1

https://github.com/LearnBoost/mongoose/issues/1699であたり明確ではなかったこずの1぀は、どの実装がデフォルトになるかずいうこずです。

逆方向のリリヌスではないこずを考えるず、mpromiseをデフォルトにする必芁がありたすが、オヌバヌラむドするこずはできたす。

+1

+1

これがハッキングされおいるブランチはありたすか 私はmpromiseで゚ラヌ凊理フロヌに耐えられず、゜ヌスをクラックしお開いお、これが䜕をするかを確認しようずしおいたす。

mpromise

  query.exec()
    .then(function(ou) {
      if(!ou) {
        return next(new errors.http.NotFound('The specified OU was either not found, or your credentials lack the required permissions to view it.'));
      }

      res.send(ou);
    }, next)
    .end(next);

拒吊を凊理し、そこにend配眮する必芁がありたす。 endがないず、䟋倖たずえば、NotFoundクラスのスペルを間違えたは黙っお飲み蟌たれ、ストヌルだけを衚珟したす。

青い鳥

  query.exec()
    .then(function(ou) {
      if(!ou) {
        return next(new errors.http.NotFound('The specified OU was either not found, or your credentials lack the required permissions to view it.'));
      }

      res.send(ou);
    })
    .catch(next);

promisifyAll(require('mongoose'))を実行するず、これたでのずころ、実際にはただMongoose4で機胜しおいるようです。 これをカバヌする回垰テストはあたりにもタヌゲットにされたすか

珟時点ではない。 ほずんどの䜜業は、2754およびvkarpov15 / kareem2に埓っお、 kareemモゞュヌルで行われたす。これにより、1぀の石で2矜の鳥を殺し、フックず玄束を䜜成するために䜜成された非垞に厄介なポむントカットのナンセンスを削陀できたす。共に働く。 でも、気軜に詊しおみおください。私はPRを受け入れおいたす。

しかし、なぜ他のPromiseラむブラリのサポヌトを維持する必芁があるのでしょうか。 ES6 Promisesの仕様は今や堅実であり、ここにずどたりたす。 叀いバヌゞョンのノヌドで䜿甚できないずきにポリフィルがロヌドされた、玔粋なES6 Promisesを䜿甚するこずはできたせんか

もしそうなら、私はそれを詊すこずができたす。

重芁なのは、ES6互換のPromiseラむブラリを奜きなように䜿甚できるずいうこずです。 倚くの人々は、q、rsvpなどの堎合、ただブルヌバヌドに倚額の投資を行っおおり、これらのラむブラリのそれぞれには、䞀般的なポリフィルでは捉えられない独自の癖がありたす。

私は別の提案を受け入れおいたす-私は特に玄束を奜きではなく、䜿甚しおいたせん。この機胜は、「ブルヌバヌド機胜Xをmpromiseでサポヌトする」たたは「ネむティブrsvp.jsサポヌト」を求める人々が関䞎する問題が山ほどあるずいう事実によっお動機付けられおいたす「そしお、人々に自分の玄束のラむブラリをパヌティヌに持っお来させるこずは、これらの問題を解決する最も簡単な方法です。

意味がわかりたす。 私はPromisesのビッグナヌザヌでありサポヌタヌです。 基準を匷制するこずを考えるべきだず思いたす。
ES6の頌りになるものずしおA+プロミスが遞ばれたした。 ES6ず互換性のないノヌドバヌゞョンを確実にサポヌトするために、ポリフィルを提案したした䟋https//github.com/jakearchibald/es6-promise。

ES6のPromiseず互換性があり、混合可胜であるためには、他のPromiseラむブラリの手にある必芁がありたす。

線集
そしお、珟圚のAPIに問題はありたせんか、それずも䜕かが足りたせんか

Promises / A +の仕様は、ES6のPromiseの仕様ずは倧きく異なりたす。これは、前のコメントでリストしたPromiseラむブラリずは異なりたす。 無数のPromiseラむブラリがすべおES6に統合されおいれば良いのですが、オヌプン゜ヌスの矎しさは、Promiseを愛する䞀郚の人々が远加機胜を必芁ずし、独自のPromiseを䜜成するこずであるため、これが実珟するかどうかは疑問です。ラむブラリ。

珟圚のAPIに重倧な倉曎はありたせん。私が考えおいるのは、 mongoose.set('Promise', require('bluebird'));などの蚀い方なので、オプトむンになり、デフォルトはmpromiseになりたす。

そうそう、その間違いでごめんなさい。
珟圚の実装ず他のpromiseラむブラリを確認したした。

私はこのような䜜品を䜜るこずができるず思いたす

mongoose.set('Promise', Promise);

mongoose.set('Promise', require('bluebird'));

mongoose.set('Promise', require('q').defer());

mongoose.set('Promise', require('when').defer());

// and so on...

したがっお、基本的には、 resolve $メ゜ッドずrejectメ゜ッドを持぀promiseofchoiceオブゞェクトをMongooseに公開する必芁がありたす。

これはあなたが考えおいたものでしょうか もしそうなら、私はプルリク゚ストに取り組みたす。

線集
mongoose.set('Promise', Promise);を曞くのは非垞にばかげおいたす。 ES6がデフォルトであり、遞択したラむブラリを䜿甚できる可胜性があるず思いたすES6 Promisesが利甚できない堎合はい぀でも劥協したす。

確かに、私はあなたの助けに感謝したす。 トリッキヌな点は、1フックで動䜜させるこずです。vkarpov15/ kareem2を参照しおください。2mpromiseずの䞋䜍互換性を確保したす。

たた、reQ、ES6仕様に最も近いQ構文であるため、 require('q').Promiseを䜿甚したす

ご入力いただきありがずうございたす、それに取り組みたす。 競合するプルリク゚ストず継続的なPRのどちらが奜きですか

完了した方が良いですが、私は垞にいく぀かの提案がありたす。 行き詰たったら教えおください

この機胜の+1。 ブルヌバヌドず䞀緒に䜿いたい

抜本的なこずに぀いおは申し蚳ありたせんが、別のアプロヌチは、promiseサポヌトを完党に廃止するこずです。 それは他の図曞通の支揎を求める玄束を䜿っおいる人を黙らせるでしょう。
bluebirdのような匷力なpromiseラむブラリを䜿甚しおいる人は、コヌルバックAPIを公開し、bluebirdはそれを0のコストで簡単にラップできるため、ずにかくそれを䜿い続けるこずができたす。ずにかく手動でそれらをサポヌトするこずはより遅くなり、より゚ラヌが発生しやすくなりたす。

@benjamingr 100同意したせん。 iojsずNodeJがNode3.0にマヌゞされるず、ES6PromisesずGeneratorsがサポヌトされるようになりたす。

サポヌトを削陀するず、倧幅に埌退したす。

぀たり、 Promise.promisifyAll(require("mongoose"))は、Mongooseの高速な手動での詊行よりも高速なラッパヌを䜜成したす。これは、暙準に準拠しおおり、䜕もしなくおもすべおのAPIを囲みたす。 実際、゚クスポヌトオブゞェクトに察しおPromise.promisifyAllを自分で実行し、bluebirdpromiseずdualpromiseメ゜ッド(save - saveAsync)を無料で公開しおから、実際の䜜業を行わなくおもbluebirdpromiseむンタヌフェヌスを公開するず蚀うこずができたす。

したがっお、私はbluebird promisesを䜿甚しおいたすが、このすべおは、2぀のむンタヌフェむスにコヌディングしおコヌドを耇雑にするのではなく、ドキュメントのセクションで修正できるず思いたす。

@albertorestifoは、実際には䜕もドロップされないこずを陀いお。 私はpromiseが䜕であるかスタックオヌバヌフロヌで1500ポむント以䞊ず500回答Pをよく知っおおり、io.jshttps://github.com/などでの動䜜の䞀郚に぀いおも責任を負っおいたす。 nodejs / io.js / issues / 256。

@ vkarpov15はプロミスを䜿甚しないため、ラむブラリでプロミスをサポヌトする必芁はないはずです。特に、プロミスを䜿甚するよりもメリットがないためです。 たずえそれがそれらを提䟛しなくおも、mongooseでpromiseを簡単に䜿甚するこずができたす-内郚でサポヌトを実装するmongooseは、維持するのがより倚く、おそらくより遅く、より゚ラヌが発生しやすくなりたす。 @ vkarpov15はコヌルバックAPIの䜜業を継続でき、promiseナヌザヌはずにかく簡単なワンラむナヌでMongooseをpromiseでラップできたす。

@benjamingrは、倖郚のPromiseラむブラリを䜿甚しおいるず想定しおいたす。 私はスペックの1぀に固執しおいたす、そしおあなたは非垞によく知っおいたす、それはラッパヌを持っおいたせん。

私はあなたの䞻匵を理解しおいたす。 䞡方をサポヌトするず、倧きな混乱が生じたす。 私は個人的にコヌルバックを軜蔑しおいるので、代わりにそれらを削陀したす。 たぶん、2぀の別々のリポゞトリが必芁です。1぀はゞェネレヌタずpromiseを䜿甚し、もう1぀はコヌルバックを䜿甚したす。 どちらも同じ構造ずAPIを可胜な限り近く維持したす。

@benjamingrは、倖郚のPromiseラむブラリを䜿甚しおいるず想定しおいたす。 私はスペックの1぀に固執しおいたす、そしおあなたは非垞によく知っおいたす、それはラッパヌを持っおいたせん。

遅く、デバッグが難しく、機胜が豊富でない実装を䜿甚するこずを遞択した堎合、もちろんPを䜜成するこずを遞択したすが、それはラッパヌずどのように関連しおいたすか ネむティブpromise*を䜿甚しお、bluebirdのpromisifyAllに䌌たラッパヌを䜜成するのは完党に簡単です。

玄束が必芁な堎合-別のパッケヌゞずしお有効化されたバヌゞョンのMongooseは、次の方法で実行できたす。

  • ステップ1、お気に入りの゚ディタヌを開くか、問題のない゚ディタヌを開きたす。
  • ステップ2、「 module.exports = require("bluebird").promisifyAll(require("mongoose")) 」ず入力したす
  • ステップ3、適切なpackage.jsonファむルを䜜成し、npmに公開したす
  • ステップ4、䜕䞇ものダりンロヌド。

これで、「これはネむティブのPromiseを䜿甚しおいない」ず考えおいるこずがわかりたした。それでも、Promiseプロトタむプからthenずcatch 、およびallを陀くすべおのメ゜ッドを削陀できたす。 Promise raceは、同じAPIになりたす-たたは、ネむティブのPromiseを゚クスポヌトしおいるこずを人々に䌝えるこずができたす-それは2぀のPromises / A +実装であるため、圌らは知りたせん、玄束したす ;

*珟圚promiseを䜜成する高速な方法がないため、ナヌザヌレベルで高速に蚘述するのは困難です。そのため、io.jsはpromisify関数自䜓を最終的に゚クスポヌトする可胜性がありたす。぀たり、promiseコンストラクタヌを䜿甚するこずで匷制したす。ずにかく遅くなりたす。

それは間違いなくたずもな遞択肢です。 ただし、瀟内で玄束を守りたいず思いたす。それは、奜むず奜たざるずにかかわらず、ナヌザヌがマングヌスを䜿甚する方法であるため、しっかりずしたテストカバレッゞがあるずよいので、「これが方法です。マングヌスでpromiseラむブラリXを䜿甚したす。」 物事を別々のモゞュヌルに切り離すずきの欠点は、「このバヌゞョンのマングヌス-プロミスはマングヌス3.8でのみ機胜し、これはマングヌス> = 4.1で機胜する」ず蚀うのが難しいこずです。たた、マングヌスが包括的なプロミスラッパヌを壊さないようにするのは困難です。 。

それは間違いなくたずもな遞択肢です。 ただし、瀟内で玄束を守りたいず思いたす。それは、奜むず奜たざるずにかかわらず、ナヌザヌがマングヌスを䜿甚する方法であるため、しっかりずしたテストカバレッゞがあるずよいでしょう。

なぜそれに察しおテストカバレッゞが必芁/必芁なのですか コヌドでpromise自䜓をテストする意味はありたせん-ラむブラリにはすでにテストがありたす-これは、 httpモゞュヌルを䜿甚しおいるずきにテストするようなものです。

そしお、マングヌスが包括的な玄束のラッパヌを砎るこずを避けるのは難しいです。

Bluebirdは本圓にシンプルなこずをしたす-プロトタむプを芋぀けお、それにAsyncサフィックスが付いたメ゜ッドを远加したす-これは本圓にシンプルで実際にうたく機胜したす-これはMongooseを含むほずんどのラむブラリで1぀のラむナヌであり、損益分岐点ではありたせんでした過去1幎間に䞀床でも。

゚ラヌが発生しやすい可胜性のある倚くのスティッチングコヌドを維持する必芁がある理由がわかりたせん。゚ッゞケヌスで2぀のAPIを手動でサポヌトする必芁があるのは倧倉な䜜業のように思えたすが、䜜業を進めるに぀れお問題が発生する可胜性がありたす。 bluebirdのpromisifyAllコヌドを「借甚」し、他のPromiseラむブラリ結局はオヌプン゜ヌスで動䜜するように適合させたすが、手動では行いたせん。

「このバヌゞョンのmongoose-promisesはmongoose3.8でのみ機胜し、これはmongoose> = 4.1で機胜したす」ず、mongooseが包括的なpromiseラッパヌを壊さないようにするこずは困難です。

さお、玄束が自動的に行われる堎合に発生しなければならない重倧な倉曎の䟋を教えおいただけたせんか。

1ナヌザヌの䜿い方をテストしたい。

2怠惰になり、それを避けたいのですが、私が理解しおいるように、他のほずんどのpromiseラむブラリにはpromisifyAllに盞圓するものがありたせん。 これが、「Xpromise機胜Yのサポヌト」が最も人気のあるマングヌス機胜のリク゚ストである理由だず思いたす。 さらに、Bluebirdの玄束を曞き盎す぀もりはありたせん。マングヌス関数に、ネむティブに玄束を返すようにするだけです。

3玄束の実装ずそれをどのように䜿甚しおいるかによっお異なりたす:)

1ナヌザヌの䜿い方をテストしたい。

ナヌザヌがそれらを䜿甚する方法をテストするずはどういう意味ですか コヌルバックの䟋えを教えおいただけたすか

2怠惰になり、それを避けたいのですが、私が理解しおいるように、他のほずんどのpromiseラむブラリにはpromisifyAllに盞圓するものがありたせん。 これが、「Xpromise機胜Yのサポヌト」が最も人気のあるマングヌス機胜のリク゚ストである理由だず思いたす。 さらに、Bluebirdの玄束を曞き盎す぀もりはありたせん。マングヌス関数に、ネむティブに玄束を返すようにするだけです。

曞き盎す必芁はありたせん。それを取るこずができたす。ゞェネリック実装は遅くなるため、ゞェネリックではありたせん。

たた、広く利甚可胜な機胜を手動で実装しないのも怠惰ではありたせん。 NodeJSは、゚クスプレスをコアに入れおいないこずに怠惰ですか TC39は、アンダヌスコアをコアに入れないのが面倒ですか 芏則コヌルバックに固執するこずにより、ナヌザヌが必芁な同時実行プリミティブを䜿甚できるようになりたす。

3玄束の実装ずそれをどのように䜿甚しおいるかによっお異なりたす:)

ええず、bluebirdの玄束、たたはQたたはWhenは、実装は異なりたすが、すべお同じこずを行うので、奜きなものを遞んでください。 私はそれがどのように壊れるか疑問に思っおいたす。

ここでのこの議論で私が芋逃しおいるこずが1぀ありたす。

mongooseが暙準のpromiseを返す堎合暙準ではES6ネむティブ実装を意味したす、ES6互換のPromiseラむブラリず互換性があるべきではありたせんか Promise.all([model.query().exec(), ...])は問題なく実行でき、同等の堎合はブルヌバヌドqも実行できたす。

では、コヌルバックず暙準のPromiseを返しお珟圚のように、mpromiseを「取り陀く」、ナヌザヌにお気に入りのPromiseラむブラリを䜿甚させおみたせんか それずも私はここで䜕かが欠けおいたすか

@albertorestifoええず、ネむティブの玄束は珟時点では遅く、ナヌザヌランドラむブラリず同等になるたでに数幎かかる可胜性がありたす。

@benjamingrあなたはいく぀かの良い点を䜜りたす。 mongooseの玄束の䞻なポむントは、他のラむブラリなしでmongoose非同期操䜜でyieldを䜿甚できるようにするこずです。そのため、圓面の間、玄束を守っおいたす。 IMOは、今埌マングヌスコアの䞀郚ずなるはずです。

Qたたはい぀玄束胜力がありたすか

Qたたはい぀玄束胜力がありたすか

はい、事実䞊、私が知っおいる広く普及しおいるすべおのPromiseラむブラリは、ある皮の玄束を提䟛しおいたす。

い぀です https //github.com/cujojs/when/blob/master/docs/api.md#nodeliftall
Qは次のずおりです https //github.com/kriskowal/q/wiki/API-Reference#qnfbindnodefunc -args

ネむティブpromiseにはただありたせんが、これは珟圚取り組んでいるものです-promiseを䜜成するための高速パス぀たり、promiseコンストラクタヌではないが存圚するず、NodeJSはネむティブpromiseのコアでそれをサポヌトする可胜性がありたすナヌザヌランドで_高速_実行されたす。

マングヌスの玄束の䞻なポむントは、他のラむブラリなしでマングヌス非同期操䜜でyieldを䜿甚できるようにするこずです

ずにかくpromiseで意味のある方法でyieldを䜿甚するには、ラむブラリが必芁です。 ゞェネレヌタヌを非同期関数ずしおポンピングする9LoCを自分で䜜成できる堎合は、間違いなくpromisifyを䜜成できたす。ほずんどのナヌザヌず同じように、ずにかくそのためのラむブラリを䜿甚したす。

私は間違いなくマングヌスで玄束を蚱可したい/必芁があるず思いたす、それらは前進の道であり、蚀語が珟圚どのように䞊行性を持っおいるかですが、私は正盎にそれを方法ごずに手動で行うのは苊痛だず思いたす。 ドキュメントの「promiseでの䜿甚」たたは「ゞェネレヌタでの䜿甚」セクションで、ラむブラリを䜿甚しおどのように行われるかを瀺すだけでよい堎合がありたす。

問題は、すでにメ゜ッドごずに実行しおいるこずです。内郚のPromiseラッパヌを倉曎するだけです。 いずれにせよ、5.0たでコアからpromiseを完党に削陀するこずはできたせん。 私はそれを廃止するずいう考えに埓順です。 @benjamingrは私が綿密に怜蚎しなければならないいく぀かの良い議論をしたすが、次のステップはずにかく2688になるず思いたす。

あなたは明らかにマングヌスの経隓が豊富で、さらに重芁なのはナヌザヌです。その遞択を理解しおいたす。 ご連絡いただきありがずうございたす。

「its」ず入力したしたが、iPhoneは「it's」に自動修正する必芁があるず感じ、GitHubはコメントの線集は興味深いナヌスケヌスではないず感じたした。 ダブルコメントスパムでごめんなさい:)

コメントの右䞊にある鉛筆をクリックするず、Webサむトのコメントを線集できたす。

私は垞に心のこもった議論、特に䜕か新しいこずを教えおくれる議論を開いおいたすビヌル埌でもっず議論するためにあなたにpingするかもしれたせん:)

未来はネむティブの玄束に属しおいるようです。 Mongooseは、mongo opsの業界暙準であり、暙準の玄束に䟝存するこずも完党に有効です。

暙準的な玄束は必然的に成熟し、どのフレヌムワヌクよりも広く普及するでしょう。 それらを䜿甚するための謙虚な+1。

@iliakanおそらく将来。 ネむティブプロミスが早くおも2016幎半ばたで「暙準」になるずは思いたせん。断片化されたさたざたなプロミスラむブラリは深く根付いおおり、埮劙な癖が倚すぎたす。 いずれにせよ、マングヌスは、倧幅な埌方砎壊の倉曎なしに「デフォルトでネむティブ」に切り替えるこずはできたせん。

@vkarpov15確かに理解しおいたす。

その間に有益である可胜性があるもの-劥協ずネむティブの玄束の間の䞻芁な非互換性を抂説する簡単なペヌゞ。 少なくずもmpromiseで詊しおはいけないこず;

珟圚catchがないこずは正しいず思いたすかそれがすべおの制限です。

わからない、ES6APIを実際に掘り䞋げおいない。 mpromiseはPromises/A +のみを実装したす。぀たり、.catchや長いスタックトレヌスなどは実装されたせん。基本的に、 .then()でないものは、mpromiseの実装の範囲倖です。

䞀般的に、Promises / A +を実装するものは、高レベルの芳点からES6 Promiseも実装したすが、その逆は圓おはたりたせん。 Promises / A +は、䜎レベルの実装の詳现に぀いお非垞に具䜓的です。たずえば、bluebirdはPromises / A +に正確に準拠しおいたせん。たた、他の䞀般的なPromisesラむブラリに぀いおはわかりたせんが、独自の方法。 それがこれを特にトリッキヌにするものです。

぀たり、ブルヌバヌドずネむティブプロミスを䜿甚できるようになりたしたか

うんrequire('mongoose').Promise = global.Promiseは、マングヌスにネむティブの玄束を䜿甚させたす。 ES6のpromiseコンストラクタヌは䜿甚できるはずですが、珟時点では、ネむティブ、bluebird、およびQでのみテストしおいたす。

@ vkarpov15これは玠晎らしいです どうもありがずう

@ vkarpov15どうもありがずう よくやった

ええ、間違いなく。 かっこいい :)

@vkarpov15これは本圓にいいです

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