2017-04-23 14 views
0

私はノードサーバーとangularJSアプリケーションを持っています。ノードサーバーは送信後にヘッダーを設定できません

私は1つのレコードに関する情報を得るためのルートを持っています。 「:ID/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) 
     }); 
     } 
}]); 

ノード -

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-the-are-sent) -to-the-client) –

+0

内部ではforEach関数からの戻り値が返され、app.get関数からの戻り値は返されません。 'res.status(404).end()'は常に実行されます。 – JJJ

+0

可能性のある[ifEachの匿名関数の内部の条件がうまくいかない場合](http://stackoverflow.com/questions/38274001/if-condition-inside-foreachs-anonymous-function-does-not-work) – JJJ

答えて

1

server.jsあなたが同じ要求に対して複数の応答を送信しようとしていますクライアントから送信されますが、一度しか送信できません。

変更この:これに

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(結果)、ok? –

+0

@LuizAlvesうん、ありがとう –

+0

それは働いている。ありがとうございました。 –

関連する問題