[編集] これはフロー ルーターに固有の問題です。ここで問題を開始しました: 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!
それで、私が理解できなかったのはここで何ですか?
ちなみに、私はメソッドでinsert
、update
、ができます。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();
},