#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/#response4. это сработало, удалив
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 };
});
};
}