Как исправить 'SyntaxError: неожиданный токен # в JSON в позиции 0' - пустое тело POST - PullRequest
0 голосов
/ 25 марта 2019

У меня есть облачная функция, на которой работает Express, которая служит конечной точкой веб-перехватчика. Мой клиент отправляет запрос POST с нулевым значением тела. И сервис возвращает 400 Bad Request с этим журналом:

    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 "Тип содержимого: application / json" -X POST {endpoint_url}

ответ 400 / SyntaxError:

curl -d null -H "Тип содержимого: application / json" -X POST {endpoint_url}

Экспресс, похоже, не достигнут, поэтому я полагаю, что запрос проанализирован и проверен заранее? Как я могу зарегистрировать запрос, чтобы проанализировать, почему он отклонен?

спасибо

1 Ответ

0 голосов
/ 25 марта 2019

Если мы посмотрим на трассировку стека из кода, мы обнаружим, что она приблизительно равна здесь (источник). Читая этот код, мы, кажется, обнаруживаем, что ожидаемые / требуемые входные данные должны быть в формате JSON, который начинается либо с { (объект), либо с [ (массив). Это будет означать, что null или даже скалярное значение потерпит неудачу с описанной ошибкой.

Если мы затем посмотрим на документацию bodyParser, найденную здесь , мы прочитаем о параметре, называемом strict, который, когда установлен на true, инструктирует наш синтаксический анализатор только принимать объекты или массивы, когда false позволяет нам принимать и скаляры. Поскольку по умолчанию strict составляет true, я предполагаю, что можно передавать только объекты или массивы.

Если это так, то отправка null будет недопустимым / неподдерживаемым параметром. Может случиться так, что если вам нужно отправить одно скалярное значение, отправьте его как значение поля в объекте:

{
  "value": null
}

или как элемент в массиве

[null]
...