2016-12-22 17 views
5

मैं एक REST API का उपभोग करने वाले ग्राफ़क्लुएल सर्वर बनाने के लिए graphql-server-express का उपयोग कर रहा हूं।जब संकलक त्रुटि को फेंक देता है तो ग्राफिकल रीडायरेक्ट

मैं इस स्थिति में हूं कि एक आरईएसटी कॉल 301 या 401 स्टेटस कोड वापस कर सकता है जब उपयोगकर्ता संसाधन तक पहुंचने के लिए प्रमाणित नहीं होता है। मैं क्लाइंट पर सेट की गई कुकी का उपयोग कर रहा हूं और ग्राफ़क्लुएल क्वेरी को हल करते समय आरईएसटी एपीआई को अग्रेषित कर रहा हूं।

क्या ऐसी त्रुटि होती है जब ग्राफ़क्यूएल एंडपॉइंट पर कॉल के जवाब में क्लाइंट को 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 में रीडायरेक्ट वास्तव में समझ में नहीं आता है। क्या होगा यदि क्लाइंट दो रूट नोड्स के साथ एक क्वेरी भेजता है, एक सफल होता है (लॉगिन करने की कोई ज़रूरत नहीं है) और कोई विफल रहता है, आप 300 या 200 क्या भेजते हैं? –

+0

यदि कम से कम एक फ़ील्ड विफल हो जाता है, तो मेरे मामले में एक रीडायरेक्ट भेजा जाना चाहिए। – amann

+0

लेकिन ग्राफिक प्रश्नों को जेएस कोड द्वारा निष्पादित किया जाता है, न कि ब्राउज़र द्वारा सीधे, जेएसयूटी रीडायरेक्ट भेजने का मतलब यह नहीं है कि ब्राउजर लॉगिन पेज लोड करेगा। आपके ग्राफ़क्ल क्लाइंट को इस प्रतिक्रिया कोड का पता लगाने की आवश्यकता है, फिर ऐसा होने पर कुछ करने के लिए हार्डकोड किया जाए। –

उत्तर

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

ग्राहक के पक्ष में:

const networkInterface = createNetworkInterface(); 

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

अपोलो क्लाइंट 2.0 में, आप शायद apollo-link-error इस के लिए क्लाइंट की तरफ उपयोग कर सकते हैं।

संबंधित मुद्दे