客户端等待服务器承诺解决
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;
});
};
经过调试,我发现我必须在服务器端承诺.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,这很奇怪,因为错误。response是一个状态为422的对象,checkStatus
函数对此进行检查。也许我误解了执行res.json()
这对我来说没有意义,因为在手动设置状态之前,我有以下捕获:
.catch(error => {
res.json(error.response);
});
和2控制台日志:
export const checkStatus = response => {
console.log(response.status);
console.log(response);
,这些返回:
200年{…status:200, statutext: 'OK'…}
到目前为止,我只修改了以下内容:
.catch(error => {
res.status(error.response.status);
res.json(error.response);
});
,现在它记录:
422年{…status:422, statutext: '我的自定义状态文本'…}
我不明白为什么只更改res.status也会更新响应对象本身…
相关文章:
- 如何在解决承诺之前和之后验证值
- EmberJS:在成功处理请求时解决承诺
- 蓝鸟没有正确解决承诺
- 使用 $http.post 和 res.redirect,而不解决承诺
- 如何在解决承诺后从承诺对象获取值
- 在解决承诺 AngularJS/ES6 后检索存储在服务中的数据
- CSV 完成读取后,如何解决承诺
- 茉莉花间谍和解决承诺
- 如何在轮询时不断解决Q承诺
- 拒绝并解决Q承诺
- 基于另一个承诺解决承诺
- 立即解决承诺
- 通过离子/ui路由解决承诺
- 我可以选择只在if语句的一部分中解决承诺吗
- 开玩笑-在测试前解决承诺
- 多次解决承诺
- 让双方都期待解决承诺
- 问美元.所有这些都在解决承诺之前被调用
- 在angular中解决承诺
- Angularjs单元测试解决承诺