У меня проблема с небольшим проектом, который я делал. Это, по сути, услуга, позволяющая запросы на сервере WFS более спокойным образом. Моя проблема в том, что полученный мной ответ - полная тарабарщина, но только при развертывании моего проекта в Red Hat OpenShift или Heroku. На Cloud9 все работает отлично. Имейте в виду, что я использовал этот проект как способ научить себя express и nodejs и что кодирование может быть не оптимальным.HTTP-ответ - полная тарабарщина в Nodejs/Express
Основная проблема заключается в том, что сервер WFS возвращает данные в ISO-8859-1 с акцентированными символами на французском языке, и я теряю их при работе с ответом, они либо становятся тарабарщиками, либо символом .
Я пробовал два разных способа решить эту проблему, возвращая тарабарщину при развертывании. Для первого я продлил запрос с использованием метода collect
для замены событий error
, data
и end
. В основном я запрашиваю WFS и если передается параметр format
, я преобразовываю ответ в json с модулем узла xml2js
.
req.pipe(request.get(app.get('baseUrl') + '&REQUEST=getcapabilities')).collect(function(err, body) {
if(err)
return next(err);
if(req.query.format && req.query.format.toLowerCase() == 'json'){
parseString(body,{mergeAttrs: true}, function(err, result){
if(err)
return next(err);
res.json(200, result);
});
}else if(!req.query.format){
res.type('application/xml; charset=utf-8');
res.send(200, body);
}else{
next(new Error('Le paramètre \'format\' n\'est pas du valide. La valeur acceptée est JSON.'));
}
});
и вот collect
, я получил идею от iconv-lite
модуля.
request.Request.prototype.collect = function(cb){
var res = [];
this.on('error', cb);
this.on('data', function(chunk){ res.push(chunk); });
this.on('end', function(){
cb(null, Buffer.concat(res).toString('binary'));
});
return this;
};
В то время как на Cloud9 возвращает данные без проблем, на OpenShift я получаю такой ответ:
¥UMoâ0½ó+¢\zj[Ô[email protected]è¶BâK]íÍ2É4xÛ©=.ð±hKÕîºÍ)¶çͼyãw®62ÁX¡U÷¬5ÏPNʺáp>=¿¼üúí¼W½FÇ&+¼rN¸[ðºá
±hDZäCþ¢LØÈIAêvà SHeÛÒ~¥³ä[¯×[email protected] ÓYød¹±éËõE¤Mi6[ñ¯ñh^åòdïcÛÎdþ&:«,!
o´×pÏ]ÝðÁñ\ÜHãæa3"u{
t,´Á@½õõ·¯ËH'+5j¿mOñEÔZñ[(ñAMº¢Ð
ÇûÉæÃÅw6ë/îãédرI1Nèg¾¯ÌáÃmA iÛÿÄ-Èò%Öº¥E®LàÖhWtCâÖf7ÀÑ8L´,rØþd¬W;ÀZ!¥Ù«t`C˲A©Ê>t`Íà
báÁQ§@ïY'òI{ZmXkSú=ìÍÕÅàv¯j$ÎÐ=lÒo«V¿b¢%K[
PÄ÷]Ôl¥Q{Ø_-¥;gX
,ç¬ðt2ÓÅ,Ô°"wÖ=LéZ+ü@»L9RÝývF¤jíí;¤`¸ó#
#.«.(Ó´'XAQðÑÍtûDØߺvVpIÇÃÅPsðÃòÌ«ÚYæ<AÍÌ.+ä)µ(ÛÅ£»OâÇNªL~ °Ö'ÐC3õhz<1×`#
ÏjÏ·
W,°iH
á×DöX{ÆßuâÓAÜÓ¼úñë©Ü+§/½,ú±ì5þ¯
Êì
Для второго способа, после прочтения всего я попытался с Iconv облегченный модуль для декодирования ответ в UTF-8.
req.pipe(request.get({encoding: null, url:app.get('baseUrl') + '&REQUEST=DescribeFeatureType' + ((req.params.qTypeName) ? '&TYPENAME='+req.params.qTypeName : '')}, function(err, response, body) {
if(err)
return next(err);
body = iconv.decode(new Buffer(body), "ISO-8859-1");
if(req.query.format && req.query.format.toLowerCase() == 'json'){
parseString(body,{mergeAttrs: true}, function(err, result){
if(err)
return next(err);
res.json(200, result);
});
}else if(!req.query.format){
res.type('application/xml; charset=utf-8');
res.send(200, body);
}else{
next(new Error('Le paramètre \'format\' n\'est pas du valide. La valeur acceptée est JSON.'));
}
})
);
Я по-прежнему получаю тот же результат, что и первый способ, которым я пытался. Хотя я обычно стараюсь решить свои проблемы сам, я думаю, что я ударил стену здесь. Как я уже сказал, я все еще изучаю nodejs и выражаю, поэтому это может быть очень простая вещь, которую я не учитывал. После прочтения я подозреваю, что это имеет какое-то отношение к кодировке, но что мне мешает, что он отлично работает на Cloud9, и он ломается только при развертывании.
Извините за длинную стену кода и текста, но я хотел быть максимально ясным, английский не является моим основным языком, поэтому, если вам нужны разъяснения, просто спросите прочь.
Спасибо!