Я пытаюсь отображать ошибки по-дружески, но всегда получаю трассировку стека ошибок с журналами консоли, от которых я хочу избавиться.
Идея заключается в создании Lead в нашей платформе с использованием любого источника, например, Google Sheets. Когда неверный адрес электронной почты предоставляется в начале и публикуется в нашем API, я получаю ожидаемое сообщение, которое я хочу отобразить, а затем трассировку стека.
Мое пользовательское сообщение об ошибке:
INVALID FORMAT for email. Object didn't pass validation for format email: as1@mail.
Но вот что я получаю:
INVALID FORMAT for email. Object didn't pass validation for format email: as1@mail. What happened: Starting POST request to https://cosmo-charon-production.herokuapp.com/v1/lead/vehicle Received 500 code from https://cosmo-charon-production.herokuapp.com/v1/lead/vehicle?api-key=gIBp04HVdTgsHShJj6bXKwjbcxXTogsh after 62ms Received content "{"code":"SCHEMA_VALIDATION_FAILED","message":"Request validation failed: Parameter (lead) failed sch" INVALID FORMAT for email. Object didn't pass validation for format email: as1@mail. Console logs:
Изображение, показывающее ошибку, отображаемую в Zapier
Я добавил промежуточное ПО для ErrorHandling в afterResponse
, как один из примеров, приведенных в документации Zapier.
Функция analyzeAndParse()
получает объект ошибки от API и возвращает строку с сообщением об ошибке, переведенным дружественным способом
const checkForErrors = (response, z) => {
// If we get a bad status code, throw an error, using the ErrorTranslator
if (response.status >= 300) {
throw new Error(analyzeAndParse(response.json))
}
// If no errors just return original response
return response
}
Это код, который создает Лид на нашей платформе, делая запрос к нашему API.
function createLead (z, bundle) {
const industry = bundle.inputData.industry
// add product to request based on the inputFields
leadType[industry].addProductFields(bundle.inputData)
const requestOptions = {
url: `${baseUrl}lead/${_.kebabCase(industry)}`,
method: 'POST',
body: JSON.stringify(checkSourceForCreate(bundle.inputData)),
headers: {
'content-type': 'application/json'
}
}
return z.request(requestOptions).then((response) => {
if (response.status >= 300) {
throw new Error(analyzeAndParse(response.content))
}
const content = JSON.parse(response.content)
if (content && content.leads) {
// get only the last lead from the list of leads
content.lead = content.leads[0]
delete content.leads
}
return content
})
}
Есть идеи?
Спасибо!