2017-04-23 6 views
0

Ich habe einen Knoten-Server und eine angularJS-App.Node-Server kann Header nach dem Senden nicht setzen

Ich habe eine Route, um Informationen über einen Datensatz zu erhalten.

Die Strecke ist '/ pacientes /: id'

Wenn ich bitten Daten von dieser Route i eine Störung erhalte.

Was mache ich falsch?

// Fehler:

Error: Can't set headers after they are sent. 
    at ServerResponse.setHeader (_http_outgoing.js:367:11) 
    at ServerResponse.header (C:\nodeapp\cloudapp\node_modules\express\lib\respo 
nse.js:719:10) 
    at ServerResponse.send (C:\nodeapp\cloudapp\node_modules\express\lib\respons 
e.js:164:12) 
    at ServerResponse.json (C:\nodeapp\cloudapp\node_modules\express\lib\respons 
e.js:250:15) 
    at C:\nodeapp\cloudapp\server.js:973:10 
    at Array.forEach (native) 
    at C:\nodeapp\cloudapp\server.js:971:13 
    at Layer.handle [as handle_request] (C:\nodeapp\cloudapp\node_modules\expres 
s\lib\router\layer.js:95:5) 
    at next (C:\nodeapp\cloudapp\node_modules\express\lib\router\route.js:131:13 
) 
    at Route.dispatch (C:\nodeapp\cloudapp\node_modules\express\lib\router\route 
.js:112:3) 

Hier App Controller:

angular.module("clinang").controller('ProcedimentosCtrl',['$scope','$http','$state',function($scope,$http,$state){ 
     $scope.modelo={} 
     var tipoId=$state.params.tipoId; 
     if (tipoId) { 
     $http.get('/pacientes/' + tipoId).then(function(response){ 
      $scope.modelo=response.data; 
     }, function(error){ 
      console.log(error) 
     }); 
     } 
}]); 

Knoten - server.js

var express = require('express'); 
    var bodyParser = require('body-parser'); 
    var jwt = require('jsonwebtoken'); 
    var expressJwt = require('express-jwt'); 
    var path = require('path'); 
    var app = express(); 

    // Define the port to run on 
    app.set('port', process.env.port || 80); 

    app.use(bodyParser.json()); 

    app.all('*', function(req, res, next) { 
     res.header('Access-Control-Allow-Origin', '*'); 
     res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS'); 
     res.header('Access-Control-Allow-Headers', 'Content-Type'); 
     next(); 
    }); 

    var pacientes=[ 
     {id:1, nome:'Joao'}, 
     {id:2, nome:'Maria'} 
    ]; 


    app.get('/pacientes/:id', function(req, res) { 
     pacientes.forEach(function (paciente) { 
     if (paciente.id == req.params.id) { 
      res.json(paciente); 
      return; 
     } 
     }); 
     res.status(404).end(); 
    }); 

//The 404 Route (ALWAYS Keep this as the last route) 
app.get('*', function(req, res){ 
    res.status(404).end(); 
}); 

// Listen for requests 
var server = app.listen(app.get('port'), function() { 
    var port = server.address().port; 
    console.log('Magic happens on port ' + port); 
}); 
+0

Mögliches Duplikat von [Fehler: Header können nicht gesetzt werden, nachdem sie an den Client gesendet wurden] (http://stackoverflow.com/questions/7042340/error-cant-set-headers-after-they-are-sent -to-the-client) –

+0

Rückgabe innerhalb forEachgibt von der forEach-Funktion zurück, nicht von der app.get-Funktion. 'res.status (404) .end()' wird immer ausgeführt. – JJJ

+0

Mögliches Duplikat von [wenn Bedingung innerhalb forEs anonyme Funktion nicht funktioniert] (http://stackoverflow.com/questions/38274001/if-condition-inside-foreachs-anonymous-function-does-not-work) – JJJ

Antwort

1

Sie versuchen, mehrere Antworten auf die gleiche Anfrage zu senden vom Kunden, aber Sie können es nur einmal senden.

ändern diese:

pacientes.forEach(function (paciente) { 
    if (paciente.id == req.params.id) { 
     res.json(paciente); 
     return; 
    } 
}); 

Um dies:

var result; 
pacientes.forEach(function (paciente) { 
    if (paciente.id == req.params.id) { 
     result = paciente; 
    } 
}); 
if (result !== undefined) { 
    res.json(result); 
} else { 
    res.sendStatus(404); 
} 

Die Funktionen res.json und res.sendStatus setzt den Header und die Reaktion des Körpers, und rufen Sie die .end() Funktion danach, also musst du es nicht tun.

+0

Sie meinen res .json (Ergebnis), ok? –

+0

@LuizAlves Ja, danke –

+0

Es funktioniert. Vielen Dank. –

Verwandte Themen