2

Meteor.method定義では、コールバックを呼び出すのではなく、結果を返す必要があることに少し驚いています。しかし、そうです!

Meteorでマングースグループメソッドを呼び出すRPCメソッドを作成しようとしています(meteorのデータAPIで作成できるようには見えなかったため、回避しています)。私はこのようなものを持っています:

Meteor.methods
  getdata: ->
    mongoose = __meteor_bootstrap__.require('mongoose')
    db = mongoose.connect(__meteor_bootstrap__.mongo_url)
    ASchema = new mongoose.Schema()
    ASchema.add({key: String})
    AObject = mongoose.model('AObject',ASchema)
    AObject.collection.group(
      ...
      ...
      (err,doc) -> # mongoose callback function
         # I want to return some variation of 'doc'
    )
    return ??? # I need to return 'doc' here.

上に投稿されたコードの私自身のバリエーションは機能します...私は私の流星クライアントから呼び出しを受け取ります、マングースオブジェクトはすべて魔法のように機能します。しかし、元のコンテキスト内で結果を返す方法がわかりません。

これどうやってするの?


私が行った答えは、私のコードを次のように見せます。

require = __meteor_bootstrap__.require
Meteor.methods
  getdata: ->
    mongoose = require('mongoose')
    Future = require('fibers/future')
    db = mongoose.connect(__meteor_bootstrap__.mongo_url)
    ASchema = new mongoose.Schema()
    ASchema.add({key: String})
    AObject = mongoose.model('AObject',ASchema)
    group = Future.wrap(AObject.collection.group,6)
    docs = group.call(AObject,collection,
      ...
      ...
    ).wait()
    return docs
4

3 に答える 3

4

ああ...それを考え出した。グーグルとグーグルをして、「そのようにしないで、コールバックを使用してください!」という行に沿って膨大な数のコメントを見つけた後、私はついにそれを見つけました:ファイバーを使用してください!

結局、fibres-promiseライブラリを使用することになりました。私の最終的なコードは次のようになります。

Meteor.methods
  getdata: ->
    promise = __meteor_bootstrap__.require('fibers-promise')
    mongoose = __meteor_bootstrap__.require('mongoose')
    db = mongoose.connect(__meteor_bootstrap__.mongo_url)
    ASchema = new mongoose.Schema()
    ASchema.add({key: String})
    AObject = mongoose.model('AObject',ASchema)
    mypromise = promise()
    AObject.collection.group(
      ...
      ...
      (err,doc) -> # mongoose callback function
         if err
           mypromise.set new Meteor.Error(500, "my error")
           return
         ...
         ...
         mypromise.set mydesiredresults
    )
    finalValue = mypromise.get()
    if finalValue instanceof Meteor.Error
      throw finalValue
    return finalValue
于 2012-04-20T19:03:22.083 に答える
2

例のコレクションでこの驚くべき要点をチェックしてください。

于 2012-09-04T04:19:24.080 に答える
0

ファイバー/フューチャーモジュールを使用すると、MeteorのAPIが向上する可能性があります。これは、内部で使用されるものであり、バニラメテオのインストールが付属しているためです。

あなたの例を取るために:

require  = __meteor_bootstrap__.require
Future   = require 'fibers/future'
mongoose = require 'mongoose'

Meteor.methods
  getdata: ->
    db = mongoose.connect(__meteor_bootstrap__.mongo_url)
    ASchema = new mongoose.Schema()
    ASchema.add({key: String})
    AObject = mongoose.model('AObject',ASchema)

    # wrap the method into a promise
    group = Future.wrap(AObject.collection.group)

    # .wait() will either throw an error or return the result
    doc = group(... args without callback ...).wait()
于 2012-04-22T04:26:44.030 に答える