0

http 応答の後、RabbitMQ (チャネルの作成など) を使用して混乱を送信していますが、サーバーは「エラー: 送信後にヘッダーを設定できません」と不平を言っています。

コードは次のとおりです。

var amqp = require('amqplib');
var when = require('when');

var rabbitmq_conn = amqp.connect('amqp://localhost' );

function push_keystroke_data(session_id, data) {
  var QUEUE_NAME = 'hello';
  var msg = session_id;

  when(rabbitmq_conn.createChannel()).then(function(ch) {
    var ok = ch.assertQueue(QUEUE_NAME, {durable: false});

    ok.then(function(_qok) {
      ch.sendToQueue(QUEUE_NAME, new Buffer(msg));
      console.log(" [x] Sent '%s'", msg);
      ch.close();
    });

  }).ensure(function() {
    conn.close();
  });
}

router.post('/', function(req, res, next) {

  // current session id
  var sid;

  if (req.cookies.papi) {
    sid = req.cookies.papi.session_id;
  } else {
    sid = generate_session_id();
    res.cookie('papi', {session_id: sid}, {maxAge: COOKIE_MAX_AGE});
  }

  res.send(JSON.stringify({ user_id: get_user_id(sid)}));

  var data = process_keystroke_data(req.body);
  push_keystroke_data(sid, data);

});

RabbitMQ が応答の後にヘッダーを設定していると仮定します (応答の前に RabbitMQ メッセージを送信しようとしましたが、何も解決しませんでした)。

スタック トレースは次のとおりです。

POST /api 500 220.100 ms - 16
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
    at ServerResponse.header (/Users/mikeecb/Documents/KeyNA/jsbackend/node_modules/express/lib/response.js:700:10)
    at ServerResponse.send (/Users/mikeecb/Documents/KeyNA/jsbackend/node_modules/express/lib/response.js:154:12)
    at fn (/Users/mikeecb/Documents/KeyNA/jsbackend/node_modules/express/lib/response.js:934:10)
    at View.exports.renderFile [as engine] (/Users/mikeecb/Documents/KeyNA/jsbackend/node_modules/jade/lib/index.js:374:12)
    at View.render (/Users/mikeecb/Documents/KeyNA/jsbackend/node_modules/express/lib/view.js:93:8)
    at EventEmitter.app.render (/Users/mikeecb/Documents/KeyNA/jsbackend/node_modules/express/lib/application.js:566:10)
    at ServerResponse.res.render (/Users/mikeecb/Documents/KeyNA/jsbackend/node_modules/express/lib/response.js:938:7)
    at /Users/mikeecb/Documents/KeyNA/jsbackend/app.js:62:7
    at Layer.handle_error (/Users/mikeecb/Documents/KeyNA/jsbackend/node_modules/express/lib/router/layer.js:58:5)

解決策やアイデアは大歓迎です。

4

1 に答える 1

1

問題は、RabbitMQ がヘッダーを設定していたということではなく (これは奇妙で、なぜ http を実行するのでしょうか?)、応答した後res.send(JSON.stringify({ user_id: get_user_id(sid)}));、明らかに問題である別の応答を送信しようとしたことが判明しました。

于 2015-05-23T20:57:01.813 に答える