2017-01-30 9 views
0

でコールバック()関数のラムダでmicroservice-HTTPエンドポイントスタータ機能は、機能を終了するには、次のコードが含まれて行わ:私いくつかのエンドポイントとラムダ専用APIを書き込んだ後AWSラムダは、ノード

const done = (err, res) => callback(null, { 
    statusCode: err ? '400' : '200', 
    body: err ? err.message : JSON.stringify(res), 
    headers: { 
     'Content-Type': 'application/json', 
    }, 
}); 

を私のすべての機能でこの同じコードで自分自身を見つけました。私の最初の本能は、これをモジュールに入れてコードをもっとDRYにすることでしたが、もし私がそれを行うなら、callback()関数は範囲外になります。

私は自分の関数からJSONを返すだけなので、これは特定のユースケースで唯一可能なContent-Typeになります。

どのように人々はこれに対処していますか?このコードを何らかの形でカプセル化するための実用的な(そしてエレガントな)方法はありますか?それとももっと良い選択肢ですか?

+0

const regularize = (awsCallback) => (err, res) => { awsCallback(...perYourAboveCode(err, res)) }; 

は、ハンドラは、その後のようになります。範囲外になることはありません。 – idbehold

+0

@idbeholdこれをグローバルに送信するとiffyと感じます。特に "コールバック"のような一般的なもの。 – Julian

+0

しかし、Lambdaコンテナインスタンスは、一度に1つだけハンドラを実行します。ラムダ関数を呼び出して、同じラムダ関数を最初に終了する前に2回目に呼び出すと、2回目の呼び出しで新しいコンテナが実行されます。ハンドラ関数が終了した(またはタイムアウトした)コンテナを再び利用できるようにします。したがって、ラムダ関数の文脈では、グローバルは本当に重要ではありません。 'global.MY_SUPER_SECRET_CALLBACK = callback'が気に入ったら、グローバル名をもっと具体的なものに変更することができます。 – idbehold

答えて

0

だけの巣機能:ちょうどあなたのラムダハンドラ関数の最初の行として `global.callback = callback`を設定し、それ

const myHandler = (event, context, awsCallback) => { 
    const callback = regularize(awsCallback); 
};