2016-12-22 18 views
5

をスローしたときに、私はREST APIを消費しGraphQLサーバを構築するためにgraphql-server-expressを使用していますリダイレクトします。GraphQLは、リゾルバがエラー

ユーザーがリソースへのアクセスを認証されていない場合、REST呼び出しが301または401のステータスコードを返す可能性があります。私は、クライアント上で設定され、GraphQLクエリを解決している間にREST APIに転送されたCookieを使用しています。

このようなエラーが発生した場合、GraphQLエンドポイントの呼び出しに応じてクライアントに301リダイレクトを送信することはできますか?

res.sendStatus(301) …のようなものを試しましたが、後でgraphql-server-expressがヘッダーを設定しようとしているため、これはうまく機能しません。

私もこのようなものでショートにしようとしたgraphqlExpressミドルウェアに試してみた:クライアントが正しい結果を受信しながら

export default graphqlExpress((req, res) => { 
    res.sendStatus(301); 
    return; 
}); 

、サーバーはまだこの場合TypeError: Cannot read property 'formatError' of undefinedで(エラーを出力します - 最もおそらくミドルウェアは空のオプションを受け取るため)。

この作業を取得するためにどのように良い方法はありますか?ありがとう!

+0

どこにリダイレクト? GraphQLのリダイレクトは実際には意味がありません。クライアントが2つのルートノードを持つクエリを送信し、成功した(ログインする必要はなく)ものが1つ失敗した場合、何を送信しますか、300または200ですか? –

+0

少なくとも1つのフィールドに障害が発生した場合、私のケースではリダイレクトを送信する必要があります。 – amann

+0

しかしgraphqlクエリは、ログインページをロードするブラウザを意味するものではありませんリダイレクトを送信jsut、直接ではなく、ブラウザによって、JSコードによって実行されています。あなたのgraphqlクライアントは、このレスポンスコードを検出し、それが起こったとき何かをするためにハードコードされる必要があります。 –

答えて

4

は、ここで私はこれを実装する方法を説明します。クライアント側では

// Setup 
export default class UnauthorizedError extends Error { 
    constructor({statusCode = 401, url}) { 
    super('Unauthorized request to ' + url); 
    this.statusCode = statusCode; 
    } 
} 

// In a resolver 
throw new UnauthorizedError({url}); 

// Setup of the request handler 
graphqlExpress(async (req, res) => ({ 
    schema: ..., 
    formatError(error) { 
    if (error.originalError instanceof UnauthorizedError) { 
     res.status(error.originalError.statusCode); 
     res.set('Location', 'http://domain.tld/login'); 
    } else { 
     res.status(500); 
    } 

    return error; 
    }, 
}); 

:サーバー側で

アポロクライアント2.0で

const networkInterface = createNetworkInterface(); 

networkInterface.useAfter([{ 
    applyAfterware({response}, next) { 
    if ([401, 403].includes(response.status)) { 
     document.location = response.headers.get('Location'); 
    } else { 
     next(); 
    } 
    } 
}]); 

、あなたはおそらくこのため、クライアント側でapollo-link-errorを使用することができます。

関連する問題