#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()