2016-09-30 2 views
1

Ich habe ein Szenario, wo ich eine Abrufanforderung an einen Express-Server ausführen. Der Express-Server führt dann eine Abrufanforderung an einen Rails-API-Dienst aus. Also habe ich die Client-Seite auf ein Versprechen warten zu lösen, und dieses Versprechen wird aufgelöst, sobald die server-side Versprechen nach der Kommunikation mit der Rails API aufgelöst wird.Client wartet auf Server Versprechen zu lösen

und auf der Express-Seite, ich rufe nur res.json(), sobald das Versprechen auf dem Server verrechnet.

hier ist, was der Serveranfrage wie folgt aussieht:

apiRouter.post('/login', (req, res) => { 
    const partnerId = 'id'; 
    const apikey = 'key'; 
    const apikeyIdentifier = 'id'; 
    const cerebroUrl = `http://${apikeyIdentifier}:${apikey}@localhost:3000/v1/${partnerId}/login`; 
    const data = { 
    //data 
    }; 

    httpRequest(cerebroUrl, httpMethods.post, data).then(response => { 
    res.json(response); 
    }).catch(error => { 
    console.log(error.response.status); 
    res.json(error.response); 
    }); 
}); 

und der Client-Anfrage:

const url = '/api/login'; 
const data = { username, password }; 
return httpRequest(url, httpMethods.post, data).then(response => { 
    console.log('success', response); 
    return response; 
}).catch(error => { 
    console.error('error', error); 
}); 

und ich eine Hilfsmethode, die den Zustand vor der Lösung überprüft:

export const checkStatus = response => { 
    console.log(response.status); 
    console.log(response); 
    if (response.status >= 200 && response.status < 300) return response; 
    let error = new Error(response.statusText); 
    error.response = response; 
    throw error; 
}; 

das seltsame ist, in der checkStatus-Methode protokolliert die Konsole 200 für einen Antwortstatus, aber in t er der Client request.then die Antwort hat eine 422.

Ich glaube, die erste Client-Anfrage löst zuerst als 200, aber dann, wenn der Server Versprechen verrechnet und ich bekomme 422, ist die Client-Seite bereits hinter dieser Stufe. Oder etwas ...

Gibt es eine Möglichkeit, die Versprechen auf vorhersehbare Weise zu bewältigen?

hier, was die Abrufanforderung Funktion wie folgt aussieht:

export const httpRequest = (url, method, data) => { 
    return fetch(url, { 
    method, 
    headers: { 
     'Content-Type': 'application/json', 
     'Accept': 'application/json', 
    }, 
    body: JSON.stringify(data), 
    }) 
    .then(checkStatus) 
    .then(parseJSON) 
    .then(response => { 
    return response; 
    }); 
}; 

Antwort

0

Nach dem Debuggen fand ich heraus, dass ich den Statuscode manuell auf den serverseitigen Versprechen .catch

apiRouter.post('/login', (req, res) => { 
    const partnerId = 'id'; 
    const apikey = 'key'; 
    const apikeyIdentifier = 'id'; 
    const cerebroUrl = `http://${apikeyIdentifier}:${apikey}@localhost:3000/v1/${partnerId}/login`; 
    const data = { 
    //data 
    }; 

    httpRequest(cerebroUrl, httpMethods.post, data).then(response => { 
    res.json(response); 
    }).catch(error => { 
    console.log(error.response.status); 
    res.status(error.response.status); // <-- HERE --- 
    res.json(error.response); 
    }); 
}); 

sonst setzen habe es gab eine 200 zurück, was merkwürdig ist, da die error.response ein Objekt ist, dessen Status 422 ist, und die checkStatus Funktion prüft das. Vielleicht Mißverständnis ich, was tatsächlich zurück gesendet wird, wenn eine Durchführung res.json()

es macht keinen Sinn für mich macht zwar, weil, bevor Sie den Status manuell einstellen, ich folgenden Fang hatte:

.catch(error => { 
     res.json(error.response); 
    }); 

und 2-Konsole .logs:

export const checkStatus = response => { 
    console.log(response.status); 
    console.log(response); 

und diese wurden Rückkehr:

{... Status: 200, StatusText: 'OK' ...}

und alles, was ich bisher verändert, ist dies:

.catch(error => { 
    res.status(error.response.status); 
    res.json(error.response); 
}); 

und jetzt meldet er:

{... Status: 422, status: ' Mein benutzerdefinierter Statustext '...}

I don' Ich verstehe, warum das Ändern des res.status auch das Antwortobjekt selbst aktualisiert ...

Verwandte Themen