Json.parse выдает: «Ошибка синтаксиса: неожиданный конец ввода JSON»

#node.js #json #typescript #fetch

#node.js #json #машинопись #выборка

Вопрос:

Привет, коллеги-участники stackoverflow,

Проблема

как описано в заголовке, у меня проблема с синтаксическим анализом строки в JSON.

Строка, которую я хочу проанализировать, отправляется клиентом на сервер с помощью метода POST. Запрос обрабатывается этой функцией на сервере:

 async function handleReservierung (req: Http.IncomingMessage, res: Http.ServerResponse): Promise<void> {
    res.setHeader("Content-Type", "application/json");
    res.setHeader("Access-Control-Allow-Headers", "content-type");
    res.setHeader("Access-Control-Allow-Origin", "*");

    let body: string = "";
    req.on("data", chunk => {
        body  = chunk.toString();
    });
    req.on("end", () => {
        console.log(JSON.parse(body));
        res.end(body);
    });
} 
 

Я читал о входящих запросах POST и о том, как их обрабатывать, и увидел это решение с входящими фрагментами, добавленными в тело переменной. Пока все хорошо.

Я подумал, что, вероятно, фрагменты были добавлены неправильно, но, как я console.log(body) , это дало бы мне совершенно правильную строку:

 {"ids":["600c4eff6c54c802cc1cac4f","600c4f576c54c802cc1cac51"],"name":"Someons Name"}
 

как это проверено в валидаторе JSON.
Я создал интерфейс

 interface Reservierungen {
    ids: number[];
    name?: string;
}
 

который используется на стороне клиента для заполнения всех данных, а затем его отправки в теле запроса с JSON.stringify(body)
Когда он теперь JSON.parse(body) запускается на сервере, он выдает эту ошибку:

 SyntaxError: Unexpected end of JSON input
    at JSON.parse (<anonymous>)
    at IncomingMessage.<anonymous> (C:UsersfelixDocumentsGISGIS-WiSe2020_2021serverindex.js:72:26)
    at IncomingMessage.emit (events.js:327:22)
    at endReadableNT (_stream_readable.js:1221:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:21)
 

Зачем мне нужно анализировать JSON?

Я хочу получить данные из объекта JSON для обновления моего MongoDB. Я думал, что могу просто проанализировать строку JSON, отправленную в теле, и использовать ее для обновления БД. После того, как я застрял на некоторое время, я любезно прошу у вас совета сейчас 🙂

Важно знать
Из-за ограничений нашего проекта uni: я не использую какие-либо библиотеки, такие как express или jquery, я прошу использовать решения nativ typescript.

Я предполагаю, что что-то не так со строкой, но я не могу понять, что это такое. Я уже пытался обрезать пробелы, которые тоже не помогли.

Надеюсь, я дал вам всю необходимую информацию.
Заранее благодарю.

Комментарии:

1. console.log(body) может пропускать непечатаемые значения, например, нулевой терминатор. вы уверены, что в строке нет никакого мусора, который вы просто не видите здесь?

2. После некоторых исследований я действительно обнаружил проблему. Строка JSON была напечатана только после undefined из предполетного запроса. Итак, сервер попытался JSON.parse(undefined) , что привело к указанной ошибке. Спасибо за вашу помощь.

Ответ №1:

Я понял это.

Проблема заключалась в том, что я скопировал выборку из MDN и включил CORS в fetch() инструкции.
При включенном CORS появляется предполетный запрос (CORS Details) с заголовком OPTIONS . Мой сервер Typescript не был настроен на прием запросов CORS (поэтому нет способа обрабатывать заголовок OPTIONS) и пытался использовать udefined тело предполетного запроса.

Я отключил заголовок CORS в fetch() инструкции. Что привело к рабочей JSON.parse()