2

私はbase64エンコーディングを実装しようとして立ち往生しているnode.jsの初心者です。サーバーが base64 メッセージを受信/処理していないようです。以下のコード:

サーバ:

var http = require('http');
http.createServer(function (req, res) {
  req.on('data',function(b) {
    console.log("HEY!"); // <--- Never gets called
    var content = new Buffer(b, 'base64').toString('utf8')
    console.log("CLIENT SAID: "+content);
    var msg = JSON.parse(content);
    // do stuff and respond here...
  });
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

クライアント:

var http = require('http');
var options = {
  hostname : 'localhost',
  port     : 1337,
  method   : 'POST'
};
var req = http.request(options, function(res) {
  res.setEncoding('base64');
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});
req.on('error', function(e) {
  console.log('problem with request: ' + e.message);
});

// write data to request body
var msg = {'name':'Fred','age':23};
var msgS = JSON.stringify(msg);
req.write(msgS,'base64');
req.end();

私が間違っていることはありますか?

4

1 に答える 1

2

私は修正を思いつきました。req.write(data, 'base64');使用中に、リクエストが終了しないことに気付きました。代わりに、base64 でエンコードされたバッファを作成し、それをリクエストに書き込みました。

これらの正確なスニペットはローカルホストでテストされました:

クライアント:

var http = require('http');
var options = {
  hostname: 'localhost',
  port: 1337,
  method: 'POST'
};
var req = http.request(options, function (res) {
  res.setEncoding('base64');
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

req.on('error', function(e) {
  console.log('problem with request: ' + e.message);
});

var msg = {
  'name': 'Fred',
  'age': 23
};
var msgS = JSON.stringify(msg);
var buf = new Buffer(msgS, 'base64');

req.write(msgS);
req.end();

サーバ:

var http = require('http');
http.createServer(function (req, res) {
  var content = '';
  req.on('data', function (chunk) {
    content += chunk;
  });
  req.on('end', function() {
    content = content.toString('base64');
    console.log(content);
    //content returns {"name": "Fred","age": 23};

    res.end();
  });
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

それらとは別に、あなたのコードにこれらのエラーがあることに気付きました。

req.on('data',function(b) {
  var content = new Buffer(b, 'base64').toString('utf8')
});

bこの場合、実際にはすでにバッファであることに注意してください。を使用する必要がありますb.toString('base64');bまた、実際にはデータの断片のみであることにも注意してください。代わりに のデータを収集し、イベントをbリッスンして、最終的にデータを処理する必要があります。endの場合req.write(data, 'base64');、最後は決して発火せず、イベントが発火する代わりにハングアップにつながります。

これは、データを収集する方法です。

var content = '';
req.on('data', function(b) {
  content += b;
});
req.on('end', function() {
  //do something with content
});
于 2013-05-26T04:11:31.437 に答える