[英]client waiting on server promise to resolve
我有一個場景,我正在對快速服務器執行獲取請求。 然后,快速服務器對rails 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以獲取響應狀態,但是在客戶端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;
});
};
調試后我發現我必須在服務器端的promise .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);
});
});
否則它返回200,這很奇怪,因為error.response是一個狀態為422的對象, checkStatus
函數檢查它。 也許我誤解了執行res.json()
時實際發回的res.json()
它對我來說沒有意義,因為在手動設置狀態之前,我有以下問題:
.catch(error => {
res.json(error.response);
});
和2個console.logs:
export const checkStatus = response => {
console.log(response.status);
console.log(response);
這些都回來了:
200
{...狀態:200,statusText:'確定'...}
到目前為止我改變的是:
.catch(error => {
res.status(error.response.status);
res.json(error.response);
});
現在它記錄:
422
{...狀態:422,statusText:'我的自定義狀態文字'...}
我不明白為什么只更改res.status也會更新響應對象本身...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.