Ошибка оси в блоке catch, возвращающем неверный код состояния 200

#typescript #axios

Вопрос:

Совершая вызов api POST в Salesforece, не смог вернуть клиенту правильный код состояния, он возвращает правильное сообщение об ошибке, но неправильный код состояния, должно быть 400, но возвращается 200

Вот запрос, который вызывает handleCreateBusinessContactCase функцию.

 @Post('case/businessContact')
  public async handleCreateBusinessContactCase(
    @Body() requestBody: ContactRequest,
    @Request() request: koa.Request,
    @Header('X-Correlation-Id') correlationId?: string,
  ): Promise<any> {
    const logCtx = LogContext.getLogContext(request.ctx, 'handleCreateBusinessContactCase');
    const repsone = await createBusinessContactCase(logCtx, requestBody);
    return Promise.resolve(repsone);
  }

.....
return axios({
    url,
    method: 'post',
    headers: {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${tokens.authentication}`,
    },
    data: jsonData,
    timeout: 10000
  }).then((response: AxiosResponse<any>) => {
    /*if (response.status === 401) {
      log.debug(`SaleForce refused token, clear the token and try once more, status code: ${response.status}`);
    }*/
    return response.data
  }).catch((error: AxiosError) => {
    console.log(error.response?.data);  
    console.log(error.response?.status);  
    console.log(error.response?.headers); 
    return error.response?.data
  });
 

Вывод из console.log строк, как и ожидалось, но в пользовательском интерфейсе swagger я получаю правильное сообщение, но код состояния равен 200, должно быть 400!

Вот вывод журнала

 [
  {
    message: "Record Type ID: this ID value isn't valid for the user: 0120Y000000VLBKQA4",
    errorCode: 'INVALID_CROSS_REFERENCE_KEY',
    fields: [ 'RecordTypeId' ]
  }
]
400
{
  date: 'Sun, 10 Oct 2021 23:31:46 GMT',
  'set-cookie': [
    'CookieConsentPolicy=0:1; domain=icelandair--test.my.salesforce.com; path=/; expires=Mon, 10-Oct-2022 23:31:46 GMT; Max-Age=31536000',
    'LSKey-c$CookieConsentPolicy=0:1; domain=my.salesforce.com; path=/; expires=Mon, 10-Oct-2022 23:31:46 GMT; Max-Age=31536000',
    'BrowserId=PDDStioiEeyHw1UM8hQSng; domain=.salesforce.com; path=/; expires=Mon, 10-Oct-2022 23:31:46 GMT; Max-Age=31536000'
  ],
  'strict-transport-security': 'max-age=31536000; includeSubDomains',
  'x-content-type-options': 'nosniff',
  'x-xss-protection': '1; mode=block',
  'x-robots-tag': 'none',
  'cache-control': 'no-cache,must-revalidate,max-age=0,no-store,private',
  'sforce-limit-info': 'api-usage=17224/5000000',
  'content-type': 'application/json;charset=UTF-8',
  'transfer-encoding': 'chunked',
  connection: 'close'
}
 

Комментарии:

1. Предположительно, есть какой-то другой код, представляющий ваш API, который вызывает эту функцию Axios. Как этот код обрабатывает ответ? К вашему сведению, вы catch превращаете отвергнутое обещание в успешное.

2. Я добавил недостающий код.

3. Итак, как уже упоминалось, вы превратили свое отклоненное обещание Axios в решенное, которое ваш контроллер интерпретирует как успешное. Похоже, вы не делаете со своим ничего полезного catch , поэтому я бы просто опустил это. Вы видели эту часть документации Koa? koajs.com/#response

4. это сработало, удалив return Promise.resolve(repsone) и просто вернув объект. из обработчика return createBusinessContactCase(logCtx, requestBody); я только что создал свой объект возврата. вот так в обработчике throw { message: error.response?.data, status: error.response?.status }; спасибо, что указал мне правильное направление.

5. Не стесняйтесь добавлять свой собственный ответ ниже

Ответ №1:

Решение состояло в том, чтобы сначала изменить контроллер, чтобы не всегда разрешать обещание

 @Post('case/businessContact')
  public async handleCreateBusinessContactCase(
    @Body() requestBody: ContactRequest,
    @Request() request: koa.Request,
    @Header('X-Correlation-Id') correlationId?: string,
  ): Promise<any> {
    const logCtx = LogContext.getLogContext(request.ctx, 'handleCreateBusinessContactCase');
    return createBusinessContactCase(logCtx, requestBody);
  }
 

Тогда я мог бы отформатировать возвращаемый объект. как мне нравится от обработчика, как это

 export  const createBusinessContactCase() = async(): Promise<anty> {
return axios({
    url,
    method: 'post',
    headers: {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${tokens.authentication}`,
    },
    data: jsonData,
    timeout: 10000
  }).then((response: AxiosResponse<any>) => {
    /*if (response.status === 401) {
      log.debug(`SaleForce refused token, clear the token and try once more, status code: ${response.status}`);
    }*/
    return response.data
  }).catch((error: AxiosError) => {
    throw { message: error.response?.data, status: error.response?.status };
  });
};
}