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