2016-05-26 3 views
1

レコードをサーバー側のメソッドでコレクションに挿入した後、別の名前付きルートにルーティングします。しかし、私はエラーが表示されます:「方法はありません」。Meteor Iron Routerエラー:メソッドが 'go'にならない

Meteor.methods({ 
    'create_item': function (item) { 

    Items.insert(item, function (error,result){ 
     if(result){ 
     Router.go('dashboard'); 
     } 
    }); 
    }, 
}); 

ルートが正常に変更され、ページでダッシュボードテンプレートがレンダリングされますが、次のエラーが表示されます。

I20160526-12:00:15.662(3)? Exception in callback of async function: TypeError: Object function router(req, res, next) {

I20160526-12:00:15.662(3)? router.dispatch(req.url, {

I20160526-12:00:15.662(3)? //XXX this assumes no other routers on the parent stack which we should probably fix

I20160526-12:00:15.662(3)? request: req,

I20160526-12:00:15.663(3)? }, next);

I20160526-12:00:15.662(3)? response: res

I20160526-12:00:15.663(3)? } has no method 'go'

I20160526-12:00:15.663(3)? at lib/methods.js:17:16

答えて

1

あなたは、おそらくそれは正しい動作しますが、サーバー側でRouter.goとしてはそのような機能はありませんクライアント上ので、共有領域(例えばlibディレクトリ)上のメソッドを定義しました。

メソッドの結果を返してからクライアントのサイドコードでRouter.goを呼び出してください。クライアント側では

Meteor.methods({ 
    'create_item': function (item) { 
     //Insert blocks on server side, 
     //no need to use callback 
     return Items.insert(item); 
    }, 
}); 

:サーバー上

Meteor.call('create_item', item, function(err, res) { 
    if (err) { 
     console.error(err); 
    } else { 
     Router.go('dashboard'); 
    } 
}); 
+0

は、私はそれがサーバ側で利用できなかったという感覚を持っていたあなたにラミルをありがとうございます。しかし、Meteor Methodsはクライアントに公開されているので、うまくいくと思いました。 – Andy59469

1

はあなたにラミルをありがとうございます。

最終的に私はlibがサーバー側で見つからなかったことを発見しました。私は、AutoFormフックも発見しました。これはポストインサートコードを実行するよりスマートな方法です。

私は鉄のルートにこのフックを取り付けた(うまくアイアンルートコントローラは、正確には)

onRun: function() { 
    AutoForm.hooks({ 
     createItemForm: { 
     onSuccess: function(){ 
     Router.go('dashboard'); 
     } 
     } 
    }); 
    this.next(); 
    }, 
関連する問題