Как исправить ‘SyntaxError: неожиданный токен # в JSON в позиции 0’ — СООБЩЕНИЕ нулевого тела

#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]