【问题标题】:Nodejs: content encoding errorNodejs:内容编码错误
【发布时间】:2011-08-17 22:33:33
【问题描述】:

我有以下 Node.js 代码:

var net = require('net');
var sys=require('sys');

var reqHash={};
var resHash={};

var server = net.createServer( function(soc){

  soc.on('data', function(data){
    //sys.puts(data);
    var requestData=data;

    var conn = net.Socket();
    conn.connect(80,"www.xlhi.com",function(){
       conn.write(data);
    });
    conn.on("connect",function(){
       //sys.puts("connected");
    });
    conn.on("data",function(x){
      var responseData=x.toString();
      //sys.puts(responseData);
      var f=50;
      var toTransmit="";

      if(responseData!=undefined){
        var N=responseData.length;
        if(N>f){
          var p=Math.floor(N/f);
          var p_rem=N%f;

          var hash="";
          var chunk="";
          for(var i=0;i<p;i++){
            chunk=responseData.substr(f*i,f);
            hash=DJBHash(chunk);
            toTransmit+=chunk;
            if(hash<0){
              hash=hash*-1;
            }
            if(resHash[hash]!=undefined){
              //sys.puts("***Hit"+resHash[hash]);
              //toTransmit=toTransmit+"***EOH"+hash+"EOH***";
            }else{
              resHash[hash]=chunk;
              //toTransmit+=chunk;
            }
          }
          //remainder:
          //toTransmit+="***";
          //sys.puts(f*p+" "+p_rem);
          chunk=responseData.substr(f*p);
          //sys.puts("EOH"+chunk+"\n");
          hash=DJBHash(chunk);
          toTransmit+=chunk;
        }else{
           toTransmit=responseData;
        }
        //sys.puts(x.toString().substr(0,50));
        //sys.puts(toTransmit.substr(0,50));
        sys.puts(toTransmit);
        sys.puts(x);
        soc.write(toTransmit);   /*This line causes content encoding error!*/
      }
    });
  });
});

server.on('error', function (err){
  // Error processing i just pass whole object
  console.log(err);
});

server.listen(8080,"172.16.1.218");
console.log('Server is listening %d\n', 8080);


function DJBHash(str) {
  var hash = 5381;
  for(var i = 0; i < str.length; i++) {
    hash = (((hash << 5) + hash) + str.charCodeAt(i)) & 0xffffffff;
  }
  return hash;
}

具体来说,我遇到了上面标记的行的问题。当我将soc.write(toTransmit); 更改为soc.write(x) 时,一切正常,当我在浏览器中点击刷新时,我没有收到任何内容编码错误。

如您所见,toTransmit 是responseData=x.toString(); 的分块版本。我猜我需要某种方法将 toTransmit 转换为适合写入套接字的格式。我不知道该怎么做。

非常感谢任何帮助。

非常感谢,

【问题讨论】:

  • 你使用的是什么版本的节点?
  • 非常感谢您的回复。我正在使用 v0.4.10
  • 我现在想通了... soc.write(new Buffer(toTransmit))

标签: javascript string node.js


【解决方案1】:

根据文档:http://nodejs.org/docs/v0.4.10/api/http.html#response.write

response.write 接受字符串或缓冲区。如果是字符串,也需要编码,默认编码为utf-8

所以编码问题来自这样一个事实:你给他一个 UTF-8 字符串,而你的浏览器设置为另一种编码。

在这段代码中你也没有写任何标题,浏览器必须猜测你发送给他的是text/plain还是text/html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2016-12-28
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多