客户端等待服务器承诺解决
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()
时实际发回的内容
这对我来说没有意义,因为在手动设置状态之前,我遇到了以下问题:
.catch(error => {
res.json(error.response);
});
和 2 console.logs:
export const checkStatus = response => {
console.log(response.status);
console.log(response);
这些正在回归:
200
{... status:200, statusText: 'OK' ...}
到目前为止我所做的更改是:
.catch(error => {
res.status(error.response.status);
res.json(error.response);
});
现在它记录:
422
{... status:422, statusText: 'My custom status text' ...}
我不明白为什么仅更改 res.status 也会更新响应对象本身...
我有一个场景,我正在执行对快速服务器的提取请求。然后,快速服务器正在对 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()
这对我来说没有意义,因为在手动设置状态之前,我遇到了以下问题:
.catch(error => {
res.json(error.response);
});
和 2 console.logs:
export const checkStatus = response => {
console.log(response.status);
console.log(response);
这些正在回归:
200
{... status:200, statusText: 'OK' ...}
到目前为止我所做的更改是:
.catch(error => {
res.status(error.response.status);
res.json(error.response);
});
现在它记录:
422
{... status:422, statusText: 'My custom status text' ...}
我不明白为什么仅更改 res.status 也会更新响应对象本身...