2016-09-01 7 views
0

Ich benutze Knoten js, auch ich bin ein anderer Drittanbieter Coap URL anfordern.Nodejs + Kann Header nicht festlegen, nachdem sie gesendet werden

Wenn ich diesen Code ausführen, erhalten die Fehler: Kann Header nicht festlegen, nachdem sie gesendet werden.

Ich weiß nicht, welchen Fehler ich gemacht habe.

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

Code:

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) 

Bitte jemand die Lösung für dieses Problem geben. Danke.

Antwort

0

Ihr Problem wahrscheinlich liegt bei der Erstellung der Website mehrere Male. Ihr Fehler bedeutet, dass die Kopfzeile (ergo, Seite) bereits erstellt wurde und Sie versuchen, sie neu zu erstellen.

Der Täter hier würde dieser Code sein:

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

Welche Konflikte:

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

weil dieser versucht die anfängliche res.send()

1

Die errror Nachricht, die Sie außer Kraft sagt, dass Sie Versuchen Sie, eine Kopfzeile festzulegen, nachdem Sie bereits eine Wiederholung an den Client gesendet haben. In Ihrem Fall sollte das Problem sein, dass res.send 2 Mal aufgerufen wird. Sie senden, wenn ein resposse Event aufgerufen wird und danach in Funktion.

Express funktioniert in diesem Fall ein wenig anders als Nodejs es selbst.

Verwandte Themen