2016-12-22 8 views
5

graphql-server-express을 사용하여 REST API를 사용하는 GraphQL 서버를 작성합니다.리졸버가 오류를 throw 할 때 GraphQL 리디렉션

사용자가 리소스에 액세스하도록 인증되지 않은 경우 REST 호출이 301 또는 401 상태 코드를 반환 할 수있는 상황에 처해 있습니다. 클라이언트에 설정되어 있고 GraphQL 쿼리를 해결하는 동안 REST API로 전달 된 쿠키를 사용하고 있습니다.

오류가 발생했을 때 GraphQL 끝점에 대한 호출에 대한 응답으로 클라이언트에 301 리디렉션을 보낼 수 있습니까?

나는 res.sendStatus(301) … 같은 것을 시도했다. formatError에 넣었다. 그러나 이것 이후에 graphql-server-express이 헤더를 설정하려고 시도 할 때 이것은 잘 작동하지 않는다. 이 같은 뭔가 단락에 graphqlExpress 미들웨어 시도에

나는 또한 시도했다 :이 경우 TypeError: Cannot read property 'formatError' of undefined

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

클라이언트가 올바른 결과를 수신하는 동안, 서버는 여전히 (오류를 인쇄 - 대부분의 아마도 미들웨어가 빈 옵션을 받기 때문에).

이 방법을 사용하는 좋은 방법이 있습니까? 감사!

+0

어디로 리디렉션하나요? GraphQL에서 Redirect는 실제로 이해가되지 않습니다. 클라이언트가 두 개의 루트 노드가있는 쿼리를 보내면 성공하고 (로그인 할 필요가 없음) 하나는 실패하고 300이나 200은 무엇입니까? –

+0

하나 이상의 필드가 실패하면 내 경우에는 리디렉션을 보내야합니다. – amann

+0

하지만 graphql 쿼리는 브라우저가 아닌 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을 사용할 수 있습니다.

관련 문제