У меня есть Azure Function App v2 в NodeJS, который возвращает статус 500, даже если я переопределил свойство res.status
. Код выглядит следующим образом:
module.exports = async (context, req) => {
...
try {
const data = await myfunc(body)
context.res = {
status: 200,
body: data,
headers: {
'Content-Type': 'application/json'
}
}
} catch (err) {
context.log.error(err)
if (err instanceof NotFoundException) {
context.res = {
status: 204,
body: 'No answer found.'
}
} else {
context.res = {
status: 500,
body: err.message
}
}
}
}
Однако, когда myfunc
выдает исключение, статус возврата всегда равен 500 независимо от типа исключения. Поэтому, когда в этом блоке выбрасывается NotFoundException
, я получаю статус 204 при локальном запуске и 500 при работе в производственном режиме.
Я пытался сделать context.log
вызовы непосредственно перед установкой состояния на 204 Журнал отображается нормально, но статус по-прежнему равен 500, а тело отсутствует.
Я также пытался установить context.res.isRaw
на true
, но это не сработало.
Как локальные, так и удаленные проекты используют один и тот же стек (Node 12 / AzureFunction v2, более конкретно, изображение mcr.microsoft.com/azure-functions/node:2.0
, на котором работает узел 10.0).
Есть ли что-то другое, что мне не хватает в этом способе? Azure Функции имеют дело с обработкой ошибок? Почему я переопределяю свойство status на 204, но все же в Azure Runtime возвращается 500? И что еще более важно, как я сталкиваюсь с двумя совершенно разными способами выполнения кода в предположительно одной и той же среде выполнения (v2 node10)?
Моя функция. json:
{
"disabled": false,
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "res"
}
]
}