2017-04-23 83 views
0

我有一個節點服務器和一個angularJS應用程序。節點服務器無法在發送後設置標頭

我有一條路線來獲取有關一條記錄的信息。

這條路線是「/ pacientes /:身份證」

當我請該路線我得到一個錯誤的數據。

我在做什麼錯?

//錯誤:

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) 

這裏是應用程序控制器:

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) 
     }); 
     } 
}]); 

節點 - 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

可能重複的[錯誤:發送到客戶端後無法設置標頭](http://stackoverflow.com/questions/7042340/error-cant-set-headers-after-they-are-sent對客戶端) –

+0

return for forEach從forEach函數返回,而不是從app.get函數返回。 'res.status(404).end()'總是運行。 – JJJ

+0

[如果forEach的匿名函數中的條件不起作用]的可能重複(http://stackoverflow.com/questions/38274001/if-condition-inside-foreachs-anonymous-function-does-not-work) – JJJ

回答

1

您要發送多個響應到相同的請求來自客戶端,但您只能發送一次。

更改此:

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

要這樣:

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

功能res.json,並且res.sendStatus設置標題和迴應的身體,並呼籲後,該.end()功能,所以你不需要這樣做。

+0

您的意思是res .json(結果),好嗎? –

+0

@LuizAlves是的,謝謝 –

+0

它的工作。謝謝。 –

相關問題