#express #google-cloud-platform
#экспресс #google-облачная платформа
Вопрос:
У меня есть облачная функция, запускающая Express, которая служит конечной точкой веб-подключения. Мой клиент отправляет POST-запрос с нулевым значением тела. И служба возвращает 400 ошибочных запросов с этим журналом :
SyntaxError: Unexpected token # in JSON at position 0
at Object.parse (native)
at createStrictSyntaxError (/var/tmp/worker/node_modules/body-parser/lib/types/json.js:157:10)
at parse (/var/tmp/worker/node_modules/body-parser/lib/types/json.js:83:15)
at /var/tmp/worker/node_modules/body-parser/lib/read.js:121:18
at invokeCallback (/var/tmp/worker/node_modules/raw-body/index.js:224:16)
at done (/var/tmp/worker/node_modules/raw-body/index.js:213:7)
at IncomingMessage.onEnd (/var/tmp/worker/node_modules/raw-body/index.js:273:7)
at emitNone (events.js:86:13)
at IncomingMessage.emit (events.js:185:7)
at endReadableNT (_stream_readable.js:978:12)
Но null является допустимым значением JSON. Любое другое правильное значение JSON кажется прекрасным.
В качестве более конкретных примеров :
ответ 200 :
curl -d ‘{«foo»: true}’ -H «Content-Type: application /json» -X POST {endpoint_url}
ответ 400 / Синтаксическая ошибка :
curl -d null -H «Content-Type: application / json» -X POST {endpoint_url}
Экспресс, похоже, не достигнут, поэтому я полагаю, что запрос проанализирован и подтвержден заранее? Как я могу зарегистрировать запрос, чтобы проанализировать, почему он отклонен?
Спасибо
Комментарии:
1. Вы проверили наличие какого-либо реестра журналов в журналах Stackdriver?
Ответ №1:
Если мы посмотрим на трассировку стека из кода, мы обнаружим, что она указывает примерно на here (исходный код). Затем, читая этот код, мы, похоже, обнаруживаем, что ожидаемые / требуемые входные данные должны быть JSON, которые начинаются либо с {
(объекта), либо [
(массива). Это означало бы, что null
или даже скалярное значение завершилось бы ошибкой с описанной ошибкой.
Если мы затем посмотрим на документацию bodyParser, найденную здесь, мы прочитаем о вызываемой опции, strict
которая, когда установлено значение true
, предписывает нашему анализатору принимать только объекты или массивы, в то время как когда false
позволяет нам также принимать скаляры. Поскольку по умолчанию strict
равно true
, я предполагаю, что передавать можно только объекты или массивы.
Если это так, то отправка null
будет недопустимым / неподдерживаемым параметром. Возможно, если вам нужно отправить единственное скалярное значение, отправьте его как значение поля в объекте:
{
"value": null
}
или как элемент в массиве
[null]