簡體   English   中英

客戶端等待服務器承諾解決

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM