0

[編集] これはフロー ルーターに固有の問題です。ここで問題を開始しました: https://github.com/meteorhacks/flow-router/issues/205間違った道..

サーバーの起動コードで呼び出されると、Blog.findOne() は値を返します (サーバー側)

Meteor.startup( function () {
    console.log( Blog.findOne() );
    // one blog post
} );

ただし、サーバーからの呼び出しによってサーバーメソッドで呼び出されると、戻りますundefined

Meteor.methods( {
    getHomeData() {
        console.log( Blog.findOne() );
        //undefined

なんてこった?

それは古典的な方法と呼ばれます:

Meteor.call( 'getHomeData', ( err, res ) => {
    console.log( 'server call err :' + err );
    console.log( 'server call res :' + res );
} );

サーバーとクライアントの呼び出しコードは同じです。

私はそのようなことを試みました:

let test = () => {
    return Blog.findOne();
};

Meteor.startup( function () {
    console.log( test() );
    // still good
} );

Meteor.methods( {
    getHomeData: () => {
        console.log( test() );
        // still undefined WTF!

それで、私が理解できなかったのはここで何ですか?

ちなみに、私はメソッドでinsertupdate、ができます。removeそして、クライアントから呼び出すかサーバーから呼び出すかは未定義になります。それは本当に私を困惑させます...

メソッドがクライアント側で呼び出されると、機能します。

[ 編集 ]

ブロックを解除してwrapAsyncを試みました(はい、何でも試しています...)

getHomeData() {
    this.unblock();
    console.log( 'startCall' );
    return Meteor.wrapAsync( () => {
        console.log( 'start async call' );
        console.log( Blog.findOne()._id );
        return Blog.findOne()._id;
    } )();
},

クライアントから呼び出された場合は引き続き機能し、サーバーから呼び出された場合は undifined を返します ( Blog.findOne()return undefined、呼び出しはエラーを返します)。

私が見ることができる唯一の違いは、クライアントからの呼び出しに athis.connectionと noがあることthis.randomSeedです。

Futureサーバー側ではなく、クライアント側で機能し続ける方法:

Future = Npm.require( 'fibers/future' );
...
getHomeData( v ) {
    this.unblock();
    var myFuture = new Future();
    ( () => {
        myFuture.return( Blog.findOne()._id );
    } )();
    return myFuture.wait();
},
4

0 に答える 0