English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Сегодня при выполнении HTTP-запроса с помощью nodejs возвращенные данные представляют собой файл html, затем я все еще использую метод парсинга JSON-данных, который использовал раньше. Как и ожидалось,出现了错误: SyntaxError: Unexpected token in JSON at position 0
Невозможно, остается только изменить метод, преобразовав полученный объект Buffer в строку toString, затем обнаружилось, что вывод является乱码.
Впервые я подумал, что это проблема кодировки, поэтому я googled и посмотрел официальную документацию, и总结了 три метода:
1. Используйте toString с форматом кодировки в качестве параметра.
2. Используйте iconv-lite для изменения кодировки.
3. Используйте cheerio для загрузки html.
Но ни один из трех методов не был моей ошибкой, затем я увидел, что в cnode кто-то имеет похожую проблему, хотя и не такую же, но среди ответов кто-то упомянул использование gzip сжатия, и после того, как я проверил заголовки моего запроса, я действительно нашел gzip сжатие = = manual facepalm.
Зная причину проблемы, решение становится很简单.
Сначала давайте выполним npm install zlib;
Затем включите var zlib = require('zlib'); в заголовке.
Затем查阅官方 документацию, и выяснилось, что есть два способа разархивации, один - это синхронный, а другой - асинхронный.
Я здесь использую асинхронный способ.
zlib.unzip(chunk, function(error, res) { console.log(error); console.log(res+"\n"); });
Этот chunk - это наш полученный buffer объект, важно отметить, что у этого асинхронного callback есть два параметра, первый - это информация об ошибке, а второй - это所需要的 html строка.
Если нужно использовать синхронный, пожалуйста, вызовите zlib.unzipSync(buffer); ps: ошибка, которую я получил при тестировании, была unexpected end of file
Теперь моя проблема была решена完美。
Вот и все, что я хочу предложить вам по решению проблемы кракозябр в html, получаемом при использовании http-запросов в nodejs. Надеюсь, это будет полезно, и希望大家多多支持呐喊 учебник.