客户端等待服务器承诺解决

client waiting on server promise to resolve

本文关键字:解决 承诺 服务器 等待 客户端      更新时间:2023-09-26

我有一个场景,我正在执行一个获取请求到一个快速服务器。然后,快速服务器向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也会更新响应对象本身…