州プロバイダー
ステート・プロバイダーは、プロジェクト・インスタンスが使用するデータを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'