2017-05-15 7 views
0

エクスプレスとパスポートを使用してWebサーバーi node.jsを作成しました。これは、oauth 2.0戦略(https://www.npmjs.com/package/passport-canvas)を使用して認証します。認証されたとき、私のようなコールを作りたい:nodes.js内の関数とjavascriptファイル間で暗黙的にコンテキストを渡す

app.get("/api/courses/:courseId", function(req, res) { 
    // pass req.user.accessToken implicitly like 
    // through an IIFE 
    createExcelToResponseStream(req.params.courseId, res).catch(err => { 
    console.log(err); 
    res.status(500).send("Ops!"); 
    }); 
}); 

私の問題は、私は私のaccessTokenへのアクセス権を持っている、createExcelToResponseStreamからのすべての後続の呼び出しでは、希望ということです。後でビジネスレイヤーで大量のAPI呼び出しを行う必要があります。私がアクセストークンへのグローバルアクセスを作成しようとすると、私は 競合状態を(私は思う)リスクます

const rq = require("request");  
const request = url => { 
    return new Promise(resolve => { 
    rq.get(
     url, 
     { 
     auth: { 
      bearer: CANVASTOKEN // should be req.user.accessToken 
     } 
     }, 
     (error, response) => { 
     if (error) { 
      throw new Error(error); 
     } 
     resolve(response); 
     } 
    ); 
    }); 
}; 
  • - 人々はで回答を得ることすなわち:私はこのようになりますメソッドを呼び出します別の人のアクセストークンのコンテキスト。私は私が何かを知っている私のコードベースの LOFとビジネス層の機能の多くをリファクタリング に持っている必要が変数としてコンテキストを渡す場合
  • 彼らはおよそ

です知っている必要はありませんそこでは、JavaScript、スコープ、関数、モジュール、ファイルをコンテキスト全体(スコープによって、適用、バインド、これなど)に渡すことができます。スレッドごとに1つのユーザーコンテキストがあるマルチスレッド環境でやっているのと同じ方法です。

+0

createExcelToResponseStreamに2番目のパラメータを追加しますか? (申し訳ありません、他の方法はありません、JS JSが語彙的スコープを持っています) –

+0

私が望むことを目的としたフレームワークが見つかりました:continuation-local-storage [link](https://www.npmjs.com/package/continuation-local-ストレージ)。しかし、私はストレージ1からその値を取り出すことしかできないので、いくつかの設計上の問題に遭遇しました。他のリファクタリングをしない限り、値に何回もアクセスする必要がありました...私は第2のパラメータアプローチを使用することになりました。あまりにもかわいいですが、私は100%競争条件を持っていないと確信しています。 –

答えて

0

あなたができる唯一のことは、

.bind(req); 

だろうしかし、それは持っていることは、すべての内部関数呼び出し

somefunc.call(this); 

にチェーンする必要がありますまたはあなたはインライン矢印機能のみを使用

(function(){ 
    inner=()=>alert(this); 
    inner(); 
}).bind("Hi!")(); 

また、すべての関数をオブジェクトに適用し、新しいインスタンスを作成することもできます。

var reqAuthFunctions={ 
    example:()=>alert(this.accessToken), 
    accessToken:null 
}; 

instance=Object.assign(Object.create(reqAuthFunctions),{accessToken:1234}); 
instance.example(); 
0

レースの条件を避けるためにプロミスを使用することができます。のは、このモジュールを持ってみましょう :

// ContextStorage.js 
let gotContext; 
let failedGettingContext; 
const getContext = new Promise((resolve,reject)=>{ 
    gotContext = resolve; 
    failedGettingContext = reject; 
} 
export {getContext,gotContext, failedGettingContext}; 

そしてこのinititalization:

// init.js 
import {gotContext} from './ContextStorage'; 
fetch(context).then(contextIGot => gotContext(contextIGot)); 

とコンテキストを必要とするこの事:

​​

これはそれをすべてするので、明らかに非常に使用可能なコードではありませんロード時に実行されますが、私はそれがあなたにポータルでこの問題について考える方法の枠組みを与えることを願っています...私は約束を意味します...

インポートされた 'gotContext'を呼び出すと、実際には 'getContext'によって返された約束を解決します。したがって、操作の順序にかかわらず、コンテキストが依存動作を動作に設定するよう要求された後、またはシングルトンがすでに解決済みの約束を持っており、従属動作が同期して続行された後、約束を解決する。

「ContextStorage」シングルトンの約束の「ボディ」に簡単にコンテキストを取り込むことができます。しかしそれはあまりモジュラーではありません。より良いアプローチは、制御を逆転させるためにシングルトンに初期化関数を注入することですが、それはデモの目的を妨げていると感じるビットを難読化します。

関連する問題