我有一個場景,我正在執行到快速服務器的提取請求。快遞服務器然後執行對api api服務的提取請求。所以我讓客戶端等待解決的承諾,並且一旦服務器端的承諾在與rails api進行通信後解決,這個承諾就會解決。客戶端在服務器上等待承諾解決
並且在表達方面,一旦服務器上的承諾解決,我只會調用res.json()
。
這裏的服務器請求的樣子:
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);
});
});
和客戶端的請求:
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);
});
和我有檢查解決前狀態的一個輔助方法:
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;
};
奇怪的是,在checkStatus方法中,控制檯正在記錄200的響應狀態,但是在t他的客戶端request.then
的響應有一個422.
我認爲最初的客戶端請求首先解析爲200,但當服務器承諾解決,我得到422時,客戶端已經過去了這一階段。或者...
有沒有辦法以更可預測的方式處理承諾?
這裏就是獲取請求函數看起來像:
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;
});
};