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

Response is sent before all events are processed in nodejs express module

本文关键字:事件 响应 express nodejs 模块 处理      更新时间:2023-09-26

节点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}
});

注意:每个函数都应该有一个回调,最后所有回调的集体结果都会作为数组发送。