メインコンテンツまでスキップ

Momento Node.js スタイルガイド

Momento Node.jsのコードを記述する際には、パターンマッチングスタイルと簡易スタイルの2つの異なるスタイルを選択することができます。このガイドでは、2つのスタイルの違いを理解し、プロジェクトに最適なスタイルを選択できるようにします。

パターンマッチングスタイル

パターン・マッチに馴染みがない人もいるかもしれないが、これは最近のプログラミング言語でますます普及しているメカニズムです。パターンと値をマッチさせて値の型を決定し、そのプロパティを抽出します。リクエストの成否によってレスポンスの型が大きく変わるようなネットワーク・リクエストをするときに、可能性のあるレスポンスの型をすべて処理する網羅的で型安全なコードを書くことができるので、非常に便利です。

例えば、Momento の get リクエスト (または他のキャッシュ読み込みリクエスト) を発行すると、レスポンスは3つのタイプのうちの1つになります:

  • Hit - キーがキャッシュで見つかり、値が返された
  • Miss - キーがキャッシュに見つからなかったため、値が返されなかった
  • Error - キャッシュから値を読み込もうとしてエラーが発生した

ご想像の通り、このような異なるケースを型安全にモデル化した場合、どのタイプのレスポンスを受け取るかで、公開されるプロパティは大きく異なります: *Hit レスポンスには value プロパティがあり、それは undefined でないことが保証されているので、undefined のケースを処理するために if ステートメントを書く必要はありません

  • 値が返されなかったので、Miss 応答はプロパティを持ちません。
  • Error レスポンスには errorCode プロパティがあり、どのようなエラーが発生したかを示します。

パターン・マッチを使えば、次のようなコードを書くことができます:

const result = await cacheClient.get('test-cache', 'test-key');
if (result instanceof CacheGet.Hit) {
console.log(`Retrieved value for key 'test-key': ${result.valueString()}`);
} else if (result instanceof CacheGet.Miss) {
console.log("Key 'test-key' was not found in cache 'test-cache'");
} else if (result instanceof CacheGet.Error) {
throw new Error(
`An error occurred while attempting to get key 'test-key' from cache 'test-cache': ${result.errorCode()}: ${result.toString()}`
);
}

if文の各分岐で、TypeScriptコンパイラーは賢いので、result`オブジェクトの正確な型を知っていることを認識し、どの型であるかに基づいて正しいプロパティにアクセスできるようにします。このため、実行時にエラーを発見するのではなく、コンパイル時に多くの種類のエラーを発見することができます。また、通常の try/catch ブロックよりも安全にエラーオブジェクトを扱うことができます。

もしあなたの第一の目的が、リクエストに対して受け取る可能性のあるさまざまなタイプのレスポンスを徹底的に処理した、徹底的で本番に使えるコードを書くことであるなら、このパターンマッチングのスタイルが適しています。

しかし、他のクライアント・ライブラリに対して書き慣れているコードに比べると、冗長になり、記述に時間がかかることがあります。もっと簡潔なものをお望みなら、簡略化されたスタイルをご検討ください。

シンプルなスタイル

簡略化されたスタイルでは、パターンマッチや型チェックは行いません。その代わりに、レスポンスオブジェクトの .value() メソッドを呼び出すだけです。Hitの場合は値が返され、そうでない場合は undefined` が返されます。

簡略化されたスタイルを使用する場合、おそらく withThrowOnErrors 設定を有効にしたくなるでしょう。デフォルトでは、Momento はエラーをスローするのではなく、常に返り値の一部として返します。しかし、簡略化されたコードスタイルを使用している場合、レスポンスに対して .value() を呼び出して undefined を返した場合、そのレスポンスが Miss なのか Error なのかを判別することができません。withThrowOnErrors` を有効にすることで、Momento クライアントにエラーが発生したときにエラーを投げるように指示することができます。

withThrowOnErrorsを有効にする方法は以下の通り:

const cacheClient = await CacheClient.create({
configuration: Configurations.Lambda.latest().withThrowOnErrors(true),
credentialProvider: CredentialProvider.fromEnvVar('MOMENTO_API_KEY'),
defaultTtlSeconds: 60,
});

このトピックの詳細については、コンフィギュレーションとエラー処理ページを参照してください。

withThrowOnErrorsを有効にすると、次のようなコードを書くことができます:

const result = (await cacheClient.get('test-cache', 'test-key')).value();
if (result !== undefined) {
console.log(`Retrieved value for key 'test-key': ${result}`);
} else {
console.log("Key 'test-key' was not found in cache 'test-cache'");
}

また、エラーが発生した場合は例外としてスローされます。例外をキャッチし、通常のtry/catchブロックで処理することができます:

try {
const result = (await cacheClient.get('test-cache', 'test-key')).value();
if (result !== undefined) {
console.log(`Retrieved value for key 'test-key': ${result}`);
} else {
console.log("Key 'test-key' was not found in cache 'test-cache'");
}
} catch (e) {
const momentoError = e as SdkError;
if (momentoError.errorCode() === MomentoErrorCode.LIMIT_EXCEEDED_ERROR) {
console.log('Request rate limit exceeded, may need to request a limit increase!');
} else {
throw new Error(
`An error occurred while attempting to get key 'test-key' from cache 'test-cache': ${momentoError.errorCode()}: ${momentoError.toString()}`
);
}
}

単純化されたスタイルは、おそらくあなたが過去に使用したことがあるかもしれない他のNode.jsクライアント・ライブラリと比較して、より見慣れたものに見え、感じるでしょう。また、パターン・マッチ・スタイルよりも簡潔で速く書くことができます。より簡潔なコードを書くことを好み、網羅的な型チェックができないというトレードオフを気にしないのであれば、このスタイルはあなたに合っているかもしれません!