2014-09-11 3 views
1

У меня проблема с небольшим проектом, который я делал. Это, по сути, услуга, позволяющая запросы на сервере 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, и он ломается только при развертывании.

Извините за длинную стену кода и текста, но я хотел быть максимально ясным, английский не является моим основным языком, поэтому, если вам нужны разъяснения, просто спросите прочь.

Спасибо!

ответ

0

Хорошо, кажется, что, потратив время на то, чтобы написать этот большой вопрос, я смог выяснить проблему. Это был остаток старого кода, который я забыл, req.pipe(...). Я использовал для прямой передачи потока в res, прежде чем я решил добавить параметр для возврата json.

Этот способ работает хорошо. Хотя он не отвечает, почему он хорошо работал в среде разработки Cloud9. Я подожду какое-то время, прежде чем отметить это как ответ, чтобы я мог получить информацию от других людей.

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.')); 
    } 

}); 
Смежные вопросы