2016-09-01 16 views
0

ノードjsを使用しています。また、他のサードパーティのコープURLをリクエストしています。Nodejs +送信後にヘッダーを設定できません

このコードを実行するとエラーが発生します:送信後にヘッダーを設定できません。

ドン;私は間違いを知っています。

FYR:https://github.com/mcollina/node-coap

コード:

var app = require('express'); 
var router = app.Router(); 
var coap = require('coap'); 
var Q = require('q'); 
router.get('/test', function(req, res, next) {  
    var result = { 
     resp : {}, 
    };  
    Q(result).then(function(result) { 
     var deferred = Q.defer();  
     var coapConnection = { 
      host : 'abcd.com', 
      pathname : '/get', 
      method : 'GET', 
      port : '5683', 
      confirmable : true 
     }; 
     var req = coap.request(coapConnection); 
     req.write(JSON.stringify(result.body)); 
     req.on('response', function(response) { 
      var d = response.payload; 
      result.resp.response = JSON.parse(d.toString('utf8')); 
      deferred.resolve(result); 
      response.pipe(process.stdout); 
      response.on('end', function() { 
       //process.exit(0); 
       res.send(result.resp); 
      }); 
     }); 
     req.end(); 
     return deferred.promise; 
    }).then(function(result) { 
     result.resp.status = 'Success'; 
     res.send(result.resp.response); 
    }).fail(function(result) { 
     result.resp.status = 'Error'; 
     res.send(result.resp); 
    }); 

}); 

module.exports = router; 

ERROR:

throw new Error('Can\'t set headers after they are sent.'); 
     ^
Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11) 
    at ServerResponse.res.set.res.header (test/node_modules/express/lib/response.js:524:10) 
    at ServerResponse.res.json (test/node_modules/express/lib/response.js:189:36) 
    at ServerResponse.res.send (test/node_modules/express/lib/response.js:118:21) 
    at IncomingMessage.<anonymous> (test/routes/coap/trigger.js:111:9) 
    at IncomingMessage.emit (events.js:129:20) 
    at endReadableNT (test/node_modules/coap/node_modules/readable-stream/lib/_stream_readable.js:865:12) 
    at afterTickTwo (test/node_modules/coap/node_modules/readable-stream/node_modules/process-nextick-args/index.js:27:10) 
    at process._tickCallback (node.js:355:11) 

誰もがこの問題の解決策を教えてください。おかげさまで

答えて

0

あなたの問題おそらくは、サイトを複数回作成することにあります。あなたのエラーは、ヘッダ(ergo、page)がすでに作成されており、そのヘッダを再作成しようとしていることを意味します。

response.on('end', function() { 
    //process.exit(0); 
    res.send(result.resp); 
}); 

と競合:後者の試みは、初期res.send()

1

errrorメッセージを却下するので

.then(function(result) { 
    result.resp.status = 'Success'; 
    res.send(result.resp.response); 
}) 

ますことを示しています

ここで犯人は、このコードになりますあなたがすでにクライアントにリプレイを送信した後にヘッダーを設定しようとします。あなたの場合、問題はres.sendが2回呼び出されることです。あなたはresposnseイベントが呼び出されたときに送信し、その後はresposnseイベントが機能します。

Expressはこの場合nodejsと少し違って動作します。

関連する問題