2017-02-23 17 views
0

最初のリクエストは正常に機能しますが、別のリクエストの後にこのエラーメッセージが表示されます。私の論理は要求を二重にしませんが、各経路が別々に呼び出されないように見えます。node.js APIの応答が終了していません。「送信後にヘッダーを送信できません。」

/api/userへの最初のリクエストはうまくいきます。リフレッシュ後エラーが発生しましたCan't set headers after they are sent.

res.end()エラーは発生しません。

res.send()およびres.json()およびres.header('Content-Type', 'application/json'); res.end();は、リフレッシュ時にエラーを生成します。

別のAPIでres.json()はうまく動作しますが、クラス/関数やEventEmitterは使用されません。多分問題はそこにありますか?

routes.js

route.get("/", function(req, res) { 
    user.on('error', function(err) { 
     res.status(400).send({code: 900, message: err, data: null}); 
    }); 
    user.on('success', function(result) { 
     res.status(200).send({code: 200, message: 'OK', data: result}); 
    }); 
    user.getAll(); 
}); 

user.jsの

var util = require('util'); 
var EventEmitter = require('events').EventEmitter; 
var initialize = require(global.__base + "/config"); 
var db = initialize.db(); 

function User() { 
    var self = this; 
    this.get = get; 


    function _checkForErrors(error, rows, reason) { 
     if (error) { 
      self.emit('error', error); 
      return true; 
     } else if (reason) { 
      self.emit('failure', reason); 
      return true; 
     } 
     return false; 
    } 

    function _getData(error, rows) { 
     if (_checkForErrors(error, rows)) { 
      return false; 
     } else { 
      self.emit('success', rows); 
      return true; 
     } 
    } 

    function getAll() { 
     db.query("SELECT * FROM patient", _getData); 
    } 
} 
util.inherits(User, EventEmitter); 
module.exports = User; 

デシベルの初期化

module.exports = { 
    globalModules: function() { /*foo*/ }, 

    db: function() { 
     var mysql = require('mysql'); 
     var db = mysql.createPool({ 
       host:  'localhost', 
       user:  'root', 
       password: '', 
       database: 'node_docx' 
      }); 
     return db; 
    } 
}; 
+0

あなたのユーザールートを入力してください –

答えて

0

あなたがプロセスを終了するreturn応答を、必要とする:

route.get("/", function(req, res) { 
    user.on('error', function(err) { 
     return res.status(400).send({code: 900, message: err, data: null}); 
    }); 
    user.on('success', function(result) { 
     return res.status(200).send({code: 200, message: 'OK', data: result}); 
    }); 
    user.getAll(); 
}); 
0

最後に、応答を処理するBaseModelを作成しました。すべてのモデル(Userなど)は、このモデルから継承します。

var basemodel = BaseModel.prototype; 

function BaseModel() { 
    self = this; 
}; 

basemodel.sendResponse = function(res, obj) { 
    if (!res.getHeader('Content-Type')) { 
     res.header('Content-Type', 'application/json'); 
    } 
    obj.on('error', function(err) { 
     return res.status(400).end(JSON.stringify({code: 901, message: err, data: null})); 
    }); 
    obj.on('failure', function(fail) { 
     return res.status(400).end(JSON.stringify({code: 902, message: fail, data: null})); 
    }); 
    obj.on('success', function(result) { 
     return res.status(200).end(JSON.stringify({code: 200, message: 'OK', data: result})); 
    }); 
}; 
関連する問題