2017-06-29 2 views
2

Meteor(NodeJS Framework)には、Meteor Methodから呼び出された元の関数であれば、常に現在のセッションに属するuserIdを返すMeteor.userId()という関数があります。NodeJSアプリケーションで何らかの種類のコンテキストを作成するには、そこから呼び出すすべての関数でアクセスできますか?

Meteor.userId()の関数は、流星DDP?._CurrentInvocation?.get()?.connectionを使用しています。だから何とかこの "マジックライン"は私の現在のDDP接続を取得します。これはコールバックの深い部分に埋もれているときにも機能します。

どうやら流星はそれが参照する文脈を設定します。流星DDPを利用しないが、プレーンなHTTP APIである別のAPIのために、この種のトリックをしたい。私が何をしたいか

:これが必要な場合

doActualStuff = function(param1, param2, param3) { 
    // here, i am burried deep inside of calls to functions 
    // but the function at the top of the stack trace was 
    // `answerRequest`. 
    // I want to access its `context` here but without 
    // passing it through all the function calls. 
    // What I want is something like this: 
    context = Framework.getRequestContext() 
} 

answerRequest = function(context) { 
    //do some stuff 
    someFancyFunctionWithCallback(someArray, function(arrayPosition) { 
     aFuncCallingDoActualStuff(arrayPosition); 
    }) 
} 

私はanswerRequestへの呼び出しをラップすることができます。

答えて

0

メテオールはどうしているのか分かりませんが、魔法のようには見えません。 Meteorは、グローバルオブジェクト(ブラウザではwindow.Meteor、Node.jsではglobal.Meteor)は、定義されているコンテキストに存在するステートフルオブジェクトを参照するいくつかの関数を持っています。

あなたの例

answerRequestを持つことによって達成することができる(または任意の関数が answerRequestを呼び出し、または何でもしたい) getRequestContextによって返される状態を設定 setRequestContext関数を呼び出します。必要に応じて、追加の機能 clearRequestContextを持つことができます。これは、要求が終了した後にクリーンアップします。 (もちろん、非同期コードを使用している場合は、データを必要とするコードが実行されるまで、後者が呼び出されないように注意する必要があります)。

これは初歩的ですが、スニペットの下に。 window.Frameworkは、残りのコードと同じファイルで定義する必要はありません。 answerRequestが呼び出される前に初期化する必要があります。

let _requestContext = null; 
 

 
window.Framework = { 
 
    setRequestContext(obj) { 
 
    _requestContext = obj; 
 
    }, 
 

 
    getRequestContext() { 
 
    return _requestContext; 
 
    }, 
 
    
 
    clearRequestContext() { 
 
    _requestContext = null; 
 
    }, 
 
}; 
 

 
const doActualStuff = function(param1, param2, param3) { 
 
    const context = Framework.getRequestContext() 
 
    console.log('Request context is', context); 
 
} 
 

 
const answerRequest = function(context) { 
 
    Framework.setRequestContext(context); 
 
    
 
    setTimeout(() => { 
 
    try { 
 
     doActualStuff(); 
 
    } finally { 
 
     Framework.clearRequestContext(); 
 
    } 
 
    }, 100); 
 
} 
 

 
answerRequest({ hello: 'context' });
.as-console-wrapper{min-height:100%}

+0

私は二回APIを呼び出すとの間でデータベース呼び出しがあるかのように、コンテキストはコールバックに上書きされます、これは動作しませんと思います。 – Tobi

関連する問題