Вернуть JSON-ответ в ISO-8859-1 с NodeJS / Express - PullRequest
2 голосов
/ 20 марта 2019

Я создал API с Node и Express, который возвращает JSON. Данные JSON должны быть прочитаны веб-приложением. К сожалению, это приложение принимает только кодированный JSON ISO-8859-1, который оказался немного сложным.

Мне не удается вернуть JSON с правильной кодировкой, несмотря на то, что я попробовал методы в документации Express, а также все советы по поиску проблемы.

В документации Express сказано, что нужно использовать res.set () или res.type (), но ни один из них не работает для меня. Закомментированные строки - все варианты, которые я пробовал (используя Mongoose):

MyModel.find()
.sort([['name', 'ascending']])
.exec((err, result) => {
  if (err) { return next(err) }

  // res.set('Content-Type', 'application/json; charset=iso-8859-1')
  // res.set('Content-Type', 'application/json; charset=ansi')
  // res.set('Content-Type', 'application/json; charset=windows-1252')
  // res.type('application/json; charset=iso-8859-1')
  // res.type('application/json; charset=ansi')
  // res.type('application/json; charset=windows-1252')

  // res.send(result)
  res.json(result)
})

Ни один из них не влияет на ответ, он всегда превращается в "Content-Type: application / json; charset = utf-8".

Поскольку JSON должен (?) Кодироваться в utf-8, возможно ли событие использовать любую другую кодировку с Express?

1 Ответ

1 голос
/ 21 марта 2019

Если вы посмотрите на файл lib/response.js в исходном коде Express (в папке node_modules или на https://github.com/expressjs/express/blob/master/lib/response.js), вы увидите, что res.json берет ваш result, генерирует соответствующий JSON представление в JavaScript String, а затем передает эту строку в res.send.

Причина вашей проблемы в том, что когда res.send (в том же исходном файле) задан аргумент String, он кодирует строку как UTF8, а также выдает charset ответа на utf-8.

Вы можете обойти это, не используя res.json. Вместо этого постройте закодированный ответ самостоятельно. Сначала используйте существующий код для настройки заголовка Content-Type:

    res.set('Content-Type', 'application/json; charset=iso-8859-1')

После этого вручную сгенерируйте строку JSON:

    jsonString = JSON.stringify(result);

затем закодируйте эту строку как ISO-8859-1 в Buffer:

    jsonBuffer = Buffer.from(jsonString, 'latin1');

Наконец, передайте этот буфер в res.send:

    res.send(jsonBuffer)

Поскольку res.send больше не вызывается с аргументом String, он должен пропустить шаг, на котором он вызывает charset=utf-8, и должен отправить ответ с указанным вами значением charset.

...