エラー処理

スクリプト内でエラーを処理する方法を説明します。

エラーコード

Cloud Code は、スクリプトが例外をスローした場合に 422 ステータスエラーを返します。

エラー処理ロジックでは、Cloud Code API エラーレスポンスから返されるエラーメッセージの代わりにエラーコードまたはエラータイプを使用します。エラーメッセージは将来変更される可能性がありますが、エラーコードとタイプは同じままになります。

エラーのラップ

エラーを処理するにはコードを try/catch ブロックにラップします。エラーが発生した場合は、それをログに記録し、クライアントにエラーを返すことができます。

例えば、ラップされない関数を使用できます。

JavaScript

const { CurrenciesApi } = require("@unity-services/economy-2.4");

module.exports = async ({ params, context, logger }) => {
  const { projectId, playerId } = context;
  const { currencyId } = params;

  const currencies = new CurrenciesApi(context);

  const setBalance = await currencies.setPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyBalanceRequest: { balance: 100 } });
  const decrement = await currencies.decrementPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyModifyBalanceRequest: { amount: 50 } });
  const increment = await currencies.incrementPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyModifyBalanceRequest: { amount: 10 } });
  const result = await currencies.getPlayerCurrencies({ projectId, playerId });

  return result.data;
}

ラップされていない関数は、いずれかの API 呼び出しが失敗した場合にエラーを返します。一方、API 呼び出しをラップした場合は、エラーメッセージからログアウトし、エラーの詳細を取得できます。

JavaScript

const { CurrenciesApi } = require("@unity-services/economy-2.4");

module.exports = async ({ params, context, logger }) => {
  const { projectId, playerId } = context;
  const { currencyId } = params;

  const currencies = new CurrenciesApi(context);

  try {
    const setBalance = await currencies.setPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyBalanceRequest: { balance: 100 } });
    const decrement = await currencies.decrementPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyModifyBalanceRequest: { amount: 50 } });
    const increment = await currencies.incrementPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyModifyBalanceRequest: { amount: 10 } });
    const result = await currencies.getPlayerCurrencies({ projectId, playerId });

    return result.data;
  } catch (err) {
    logger.error("Failed to increment currency", {"error.message": err.message}, {"currencyId" : currencyId});
    throw err;
  }
}

Unity Dashboard でログを確認できます。エラーに関する詳細を取得するには、Live Ops > Cloud Code > Logs (ログ) を選択します。

ロギング

logger オブジェクトを使用してエラーと警告をログに記録し、スクリプトのデバッグに役立てることができます。さまざまなセキュリティレベルでメッセージをログに記録できます。これらのレベルは Unity Dashboard でログをクエリするのに役立ちます。

Cloud Code は、playerIdenvironmentIdprojectId などの属性をログに自動的に追加するため、それらをログメッセージに追加する必要はありません。

JavaScript

logger.debug(message, ...logAttributes)
logger.info(message, ...logAttributes)
logger.warning(message, ...logAttributes)
logger.error(message, ...logAttributes)
logger.fatal(message, ...logAttributes)

カスタムログ属性を追加して、ログメッセージついてより多くのコンテキストを持つことができます。例えば、Economy の呼び出しが失敗した場合、currencyId をログメッセージに追加できます。

JavaScript

logger.error("Failed to increment currency", {"error.message": err.message}, {"currencyId" : params.currencyId});

Unity Dashboard に移動し、Live Ops > Cloud Code > Logs (ログ) を選択して、ログの表示とフィルター処理を行います。

詳細については、ログの発行 を参照してください。

Unity Dashboard でのデバッグ

Unity Dashboard を使用してスクリプトをデバッグできます。

Live Ops > Cloud Code > Scripts (スクリプト) に移動し、デバッグするスクリプトを選択します。

Response (レスポンス) タブとスクリプトエディターは、エラーが発生した場所を示すのに役立ちます。

Response (レスポンス) タブには、エラーの行と列が表示されます。デバッガーは、この情報を使用し、注釈を追加して、エラーが発生した場所を Script Code (スクリプトコード) セクションで視覚的に示します。

エラーの注釈は、スクリプトに編集を行うか、スクリプトを再度実行するまで表示されたままになります。

以下は、エラーを処理およびスローする方法の例です。

JavaScript

const { CurrenciesApi } = require("@unity-services/economy-2.4");

module.exports = async ({ params, context, logger }) => {
  const { playerId, projectId } = context;
  const { currencyId } = params;

  const currencies = new CurrenciesApi(context);

  try {
    const setBalance = await currencies.setPlayerCurrencyBalance({
      projectId,
      playerId,
      currencyId,
      currencyBalanceRequest: {
        balance: 100,
      }
    });
  } catch (err) {
    if (err.response) {
      logger.error("Failed to set currency", { "error.response": err.response }, {"currencyId": currencyId});
    } else {
      logger.error("Failed to set currency", { "error.message": err.message }, {"currencyId": currencyId});
    }

    throw Error('oops');
  }

}