在nodejs express模块中处理所有事件之前发送响应
Response is sent before all events are processed in nodejs express module
节点js中的express模块出现问题。问题语句是在所有事件完成之前发送响应。
在下面的代码中,当客户端命中相应的URI时,我将调用函数"commonValidations()"。在commonValidations()函数内部,其他一些函数在内部调用。但是,在所有验证完成之前,将发送响应。
我试过使用res.on('end', callbackfunction)
,但这个语句出现了一些错误,然后我放了res.end()
函数。但在所有事件完成之前仍会发送res。
有人能帮助我在处理完所有事件后如何发送响应吗?
-->app.js(我没有放数据库连接字符串和连接池的详细信息)
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}
});
注意:每个函数都应该有一个回调,最后所有回调的集体结果都会作为数组发送。
相关文章:
- 在Javascript中的ajax响应之后未调用Dropdown事件
- Ember视图未响应用户启动的事件
- 如何使用更新图像源以响应新闻事件
- 为什么我没有得到对Comet服务器流事件的实时响应
- 基于类的单击事件在10行之后不响应-数据表
- EventSource 的响应具有非“文本/事件流”的 MIME 类型(“文本/纯文本”)
- 为什么不是't html<对象>元素响应鼠标事件
- jquery多个事件响应
- 使用命名函数设置多个事件响应
- 加载超链接页面后如何响应事件
- 响应菜单问题-如何在移动环境中处理HREF和onclick事件
- 尝试使用鼠标点击事件响应编写jQuery HTML5聊天框程序
- 使引导标记响应,jquery 事件丢失
- 节点 js 中的请求和响应事件如何彼此不同
- Jquery bind 事件没有响应
- 谷歌地图USGSO在同一级别标记上覆盖点击事件多响应
- Youtube iframe没有响应通过上图传递的指针事件的点击:none
- jQuery:点击禁用点击事件,直到ajax调用响应
- Gmaps API 从事件响应中丢失了 latlng
- 使用Jquery为循环中的元素添加事件响应器