Misskey: エラー時のAPIレスポンスの統一

Created on 19 Jan 2019  ·  7Comments  ·  Source: syuilo/misskey

現状、エラー時、APIや状況ごとに微妙に異なるレスポンスが帰ってくるようです。
例えば、auth/session/generateにappSecretを指定せずにPOSTすると以下のようなレスポンスが帰ってきます。

{"error":{"code":"INVALID_PARAM","param":"appSecret","reason":"must-be-not-undefined"}}

が、同APIに無効なappSecretを指定してPOSTすると以下のようになります。

{"error":"app not found"}

エラー処理は統一したいですし、共通フォーマットを持つべきだと考えます。皆さんはどう考えますか?


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

🧩API

Most helpful comment

後者を
{ "error": { code: "APP_NOT_FOUND", message: "app not found" }}
のような形式にしたいと思います。

All 7 comments

{ ok: false, error: "INVALID_PARAM" }

でちょうどよいと私は考える。

ただ、煩雑であるとはいえエラーレスポンスの変更は破壊的であると思うので、慎重な議論が必要だろう。

後者を
{ "error": { code: "APP_NOT_FOUND", message: "app not found" }}
のような形式にしたいと思います。

エラーレスポンスのスキーム、全てを網羅できるように統一して明確にしたら良いですね

コードレベルではエラーのオブジェクト生成する関数用意したら確実かな

そもそもエラーメッセージがnot found形式やnot-found形式、NOT_FOUND形式などバラバラなためそこをどうにかしてほしい気持ちはあります。また誤字が修正されるなどの破壊的変更の履歴もありますので可能であればエラーコードを制定してほしいです。

現在作業中で、エラーメッセージ、エラーコードのほかにエラーごとのUUIDも付与するようにしています
これなら誤字などの心配はありません

こんな感じ

export const meta = {
    requireCredential: true,
    requireModerator: true,

    params: {
        fileId: {
            validator: $.type(ID),
            transform: transform,
        },
    },

    errors: {
        fileNotFound: {
            message: 'File not found.',
            code: 'FILE_NOT_FOUND',
            id: 'caf3ca38-c6e5-472e-a30c-b05377dcc240'
        }
    }
};

export default define(meta, async (ps, me) => {
    const file = await DriveFile.findOne({
        _id: ps.fileId
    });

    if (file == null) {
        throw new ApiError(meta.errors.fileNotFound);
    }

    return file;
});

参考までにエラーの原因がクライアントに由来するものなのかサーバー側の問題なのかのフラグも付けるようにした

Was this page helpful?
0 / 5 - 0 ratings

Related issues

ibrokemypie picture ibrokemypie  ·  3Comments

tamaina picture tamaina  ·  3Comments

tamaina picture tamaina  ·  3Comments

2vg picture 2vg  ·  3Comments

tamaina picture tamaina  ·  3Comments