2016-12-22 87 views
5

Bir REST API'si tüketen bir GraphQL sunucusu oluşturmak için graphql-server-express kullanıyorum.Çözümleyici hata attığında GraphQL yönlendirmesi

Bir REST çağrısı, kullanıcının kaynağa erişmek için kimliği doğrulanmadığında 301 veya 401 durum kodu döndürmesi durumunda durumdayım. İstemcide ayarlanmış ve GraphQL sorgusunu çözerken REST API'sına iletilen bir çerez kullanıyorum.

Böyle bir hata oluştuğunda GraphQL bitiş noktasına yapılan bir çağrıya yanıt olarak istemciye 301 yönlendirmesi göndermek mümkün mü?

gibi bir şey denedim formatError ancak bu daha iyi çalışmıyor graphql-server-express bundan sonra başlıkları ayarlamaya çalışır. Böyle bir şey kısa devre graphqlExpress ara katman çalıştı üzere

Ben de denedim: Bu durumda TypeError: Cannot read property 'formatError' of undefined yılında

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

istemci doğru sonucu aldığı ederken, sunucu hala (hataları yazdırır - En Muhtemelen middleware boş seçenekleri alır çünkü).

Bunun işe nasıl alınacağının iyi bir yolu var mı? Teşekkürler!

+0

Nereye yönlendirmeli? GraphQL'de yönlendirme gerçekten anlamlı değildir. İstemci iki kök düğümle bir sorgu gönderirse, biri başarılı olursa (oturum açma gerektirmez) ve başarısız olursa, 300 veya 200 neyi gönderirsiniz? –

+0

En az bir alan başarısız olursa, benim durumumda bir yönlendirme gönderilmelidir. – amann

+0

Ancak grafql sorguları, doğrudan tarayıcı tarafından değil, JS kodu tarafından yürütülür, jsut gönderme yönlendirmesi, tarayıcı giriş sayfasını yükleyeceği anlamına gelmez. Graphql istemciniz, bu yanıt kodunu algılamalı, ardından bir şeyler yapmak için kodlanmış olmalıdır. –

cevap

4

Bunu nasıl uygulayacağım. Sunucu tarafında

: istemci tarafında

// 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; 
    }, 
}); 

: Apollo Client 2.0

const networkInterface = createNetworkInterface(); 

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

, muhtemelen bunun için istemci tarafında apollo-link-error kullanabilirsiniz.