Если вы посмотрите на файл 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
.