州プロバイダー

ステート・プロバイダーは、プロジェクト・インスタンスが使用するデータをVonage Cloud Runtimeプラットフォーム上に保存することができます。ステート・プロバイダはそのルートにキーバリューストアを持ちます。また、リストとマップがあり、それに対してさまざまな操作を実行できます。

機能

Stateプロバイダーを使ってデータを保存するには、以下の操作を使用できる:

ステートプロバイダの初期化

セッションからステート・プロバイダーにアクセスすることができる:

const session = vcr.createSession();
const state = new State(session);

この状態は、ステート・イニシャライザに渡されたセッションにスコープされるので、セッション状態と呼ぶことができる。セッションがTTLに達すると、保存されていた状態は削除されます。

その後のコード呼び出しで、同じセッションを使用してステートにアクセスできるようにしたいでしょう。そのためには、リクエストからインスタンスを初期化します:

app.post("/onMessage", async (req, res, next) => {
  try {
    const session = vcr.getSessionFromRequest(req);
    const state = new State(session);

    // Handle incoming message
  } catch (error) {
    next(error);
  }
});

Accountの状態

Accountの状態はVonageアカウントにスコープされ、すべてのプロジェクトとそのインスタンス間で利用可能です。

const state = vcr.getAccountState();

インスタンス状態

インスタンスの状態はインスタンスにスコープされ、インスタンスが破棄されると削除されます。これにより、アプリケーションの異なるセッション間でコンテキストを共有できます。

const state = vcr.getInstanceState();

ユースケース

例えば、キー・バリュー操作を使って、セッション上のオブジェクトを保存、取得、削除することができます:

app.post("/key-value", async (req, res, next) => {
  try {
    const session = vcr.createSession();
    const state = new State(session);

    // store object
    await state.set("test_obj", { "foo": bar });

    // retrieve object
    const obj2 = await state.get("test_obj");

    // delete object
    await state.del("test_obj");

  } catch (error) {
    next(error);
  }
})

あるいは、インスタンス・ステートとハッシュ・テーブル操作を使って、セッション間でデータを永続化することもできる:

app.post("/add-customer", async (req, res, next) => {
	try {
	  const instanceState = vcr.getInstanceState();
	  const customer = req.body;
	  await instanceState.mapSet("customers", { [customer.phone]: JSON.stringify(customer) });
    res.sendStatus(200);
	} catch (error) {
	  next(error);
	}
})

これは、顧客の電話番号をキーとするテーブルに顧客情報を格納している。

app.get("/on-phone-call", async (req, res, next) => {
	try {
	  const instanceState = vcr.getInstanceState();
	  const number = req.query.number;
	  const customer = await instanceState.mapGetValue("customers", number);
	  res.send(customer.name);
	} catch (error) {
	  next(error);
	}
})

顧客番号を使って、以前に保存された顧客情報を取り出すことができる。

curl --location --request POST '{INSTANCE_ENDPOINT}/add-customer' \ --header 'Content-Type: application/json' \ --data-raw '{ "id":"1", "name": "John", "phone": "101" }' curl --location --request GET '{INSTANCE_ENDPOINT}/on-phone-call?number=101'