在nodejs express模块​​中处理所有事件之前发送响应

我正在遇到节点js中的快速模块的问题。 问题陈述是在所有事件完成之前发送响应。

在下面的代码中,当客户端点击相应的URI时,我调用函数“commonValidations()”。 在commonValidations()函数内部,一些其他函数在内部被调用。 但是,在所有validation完成之前都会发送回复。

我尝试res.on('end', callbackfunction)函数res.on('end', callbackfunction)然后我得到了这个声明的一些错误,然后我把res.end()函数。 但是在所有事件完成之前仍然会发送res。

有人可以帮助我如何发送所有事件处理后的回应?

– > app.js(我没有把db连接string和连接池的细节)

 var express = require('express'); var bodyParser = require('body-parser'); var PropertiesReader = require('properties-reader'); var path = require('path'); var http = require("http"); var app = express(); var DB2Pool = require('ibm_db').Pool; GLOBAL.gCNPool = new DB2Pool(); GLOBAL.gCNString; GLOBAL.gErrors = { "teslaRequest":{type : Object}, "error":[] }; http.createServer(app).listen(3030); GLOBAL.directoryName=path.resolve(__dirname); var common = require(directoryName+'/validations/common.js'); app.post("/cfo/taxprofile/stateprofiles/validate", function(req, res){ gCNPool.open(gCNString, function(err, db){ common.commonValidations(db); res.writeHead(200, { "Content-Type": "application/json" }); res.end(JSON.stringify(gErrors)); } }); 

在stateAbbrValidation函数完成之前,响应被发送给客户端。

– > common.js

 var query = require(directoryName+'/utils/sql_queries.js'); var app = require(directoryName+'/app.js'); module.exports = { commonValidations:function(db){ stateAbbrValidation(db); } }; function stateAbbrValidation(db){ console.log('Query is '+STATE_S01_1); if(gStateAbbr == null || gStateAbbr == 'undefined') gErrors.error.push({"errorCode":"E062", "errorDesc":"Invalid State code"}); else{ db.query(STATE_S01_1.replace('<STATE>', gStateAbbr), function(err1, rows){ if(err1){ console.log(err1); } if(Object.keys(rows).length == 0){ console.log('Result size '+Object.keys(rows).length); gErrors.error.push({"errorCode":"E062", "errorDesc":"Invalid State code"}); } else{ if(gStateCodeValue != null || gStateCodeValue != 'undefined'){ var cdKeys = Object.keys(rows); var stateCd = rows[cdKeys[0]].STATE_CODE; if(stateCd != gStateCodeValue){ gErrors.error.push({"errorCode":"E062", "errorDesc":"Invalid State code"}); } } } }); } /*db.prepare(STATE_S01_1, function(err, stmt){ if(err){ console.log(err); } stmt.execute(['CA'], function(err, result, rows){ console.log(err); console.log(result); result.closeSync(); console.log(result); console.log(rows); }); });*/ } 

尝试使用async.js 。 它有助于在处理所有事件之后发送响应。 请看下面的例子:

 async.series([ function(callback){ // do some stuff ... callback(null, 'one'); }, function(callback){ // do some more stuff ... callback(null, 'two'); } ], // optional callback function(err, results){ // results is now equal to ['one', 'two'] }); // an example using an object instead of an array async.series({ one: function(callback){ setTimeout(function(){ callback(null, 1); }, 200); }, two: function(callback){ setTimeout(function(){ callback(null, 2); }, 100); } }, function(err, results) { // results is now equal to: {one: 1, two: 2} }); 

注意:每个函数都应该有一个callback函数,最后所有callback函数的集合结果都以数组forms发送。