Node.js 在NodeJS服务器上,当验证作业运行时(需要半个小时),在这段时间内,整个应用程序停止工作

Node.js 在NodeJS服务器上,当验证作业运行时(需要半个小时),在这段时间内,整个应用程序停止工作,node.js,Node.js,我正在使用MEAN stack开发我的应用程序。我的服务器有三个客户端app 1。iOS应用程序2。Android应用程序和3。基于浏览器的应用程序。所有应用程序均由单一服务器提供。当我运行一些长时间的数据处理工作时,我面临着这个问题。这项工作需要半小时才能完成一项处理。由于Nodejs的单线程模式,当这个作业开始运行时,在这半个小时内,三个应用程序都停止工作,因为服务器没有及时响应。以下是我的工作代码 1. API to invoke this processing //API to val

我正在使用MEAN stack开发我的应用程序。我的服务器有三个客户端app 1。iOS应用程序2。Android应用程序和3。基于浏览器的应用程序。所有应用程序均由单一服务器提供。当我运行一些长时间的数据处理工作时,我面临着这个问题。这项工作需要半小时才能完成一项处理。由于Nodejs的单线程模式,当这个作业开始运行时,在这半个小时内,三个应用程序都停止工作,因为服务器没有及时响应。以下是我的工作代码

1. API to invoke this processing 
//API to validate all possible combinations
app.get('/api/validateworkouts/:clubid',  SecurityService.isRestAPIRequestSecure, workoutValidateService.validateGeneratedWorkouts);
2. Following is code for validateGeneratedWorkouts function
module.exports = {
// Test generated workouts for all users and send email to admin team
    validateGeneratedWorkouts: function (req, res) {
        var clubid = req.params.clubid;
        //update club status as inprogress in database
        module.exports.updateClubWorkoutTestStatusAsInprogress(clubid, function () {
            //Get user data from database
            var query = {};
            query.username = "user@validate.com";
            documentOperationModule.getDocumentByQuery(query, constants.USER_COLLECTION, function (err, users) {
                if (!err && !Utilities.isEmptyList(users)) {
                    //Get all goals data from database
                    query = {};
                    documentOperationModule.getDocumentByQuery(query, constants.GOAL_COLLECTION, function (err, goals) {
                        if (!err && !Utilities.isEmptyList(goals)) {
                            //Get all scheduleconfigfrequencies
                            query = {};
                            documentOperationModule.getDocumentByQuery(query, constants.SCHEDULE_CONFIG_FREQUENCIES_COLLECTION, function (err, scheduleconfigfrequencies) {
                                if (!err && !Utilities.isEmptyList(scheduleconfigfrequencies)) {
                                    //Get all genders
                                    query = {};
                                    documentOperationModule.getDocumentByQuery(query, constants.GENDERS_COLLECTION, function (err, genders) {
                                        if (!err && !Utilities.isEmptyList(genders)) {
                                            //Get all experiences
                                            query = {};
                                            documentOperationModule.getDocumentByQuery(query, constants.EXPERIENCES_COLLECTION, function (err, experiences) {
                                                if (!err && !Utilities.isEmptyList(experiences)) {

                                                    //Get all durationpreferences
                                                    query = {};
                                                    documentOperationModule.getDocumentByQuery(query, constants.DURATION_PREFERENCES_COLLECTION, function (err, durationpreferences) {
                                                        if (!err && !Utilities.isEmptyList(durationpreferences)) {
                                                            //Get all clubs
                                                            query = {};
                                                            documentOperationModule.getDocumentByQuery(query, constants.CLUB_COLLECTION, function (err, clubs) {
                                                                if (!err && !Utilities.isEmptyList(clubs)) {
                                                                    var workoutRequestList = [];
                                                                    //prepare workout request for each combinations                                                                                         //loop in each users
                                                                    for (var i = 0; i < users.length; i++) {
                                                                        //loop in each goals
                                                                        for (var j = 0; j < goals.length; j++) {
                                                                            //loop in each scheduleconfigfrequencies
                                                                            for (var k = 0; k < scheduleconfigfrequencies.length; k++) {
                                                                                //loop in each genders
                                                                                for (var l = 0; l < genders.length; l++) {
                                                                                    //loop in each experiences
                                                                                    for (var m = 0; m < experiences.length; m++) {
                                                                                        //loop in each durationpreferences
                                                                                        for (var n = 0; n < durationpreferences.length; n++) {
                                                                                            var userid = users[i].userid;
                                                                                            var goalid = goals[j].goalid;
                                                                                            var gender = genders[l].genderid;
                                                                                            var experience = experiences[m].experienceid;
                                                                                            var durationpreference = durationpreferences[n].durationpreferenceid;
                                                                                            var frequency = scheduleconfigfrequencies[k].scheduleconfigfrequencyid;
                                                                                            //loop in for each possible workout sequence based on frequency
                                                                                            for (var nextworkoutseq = 0; nextworkoutseq < frequency; nextworkoutseq++) {
                                                                                                        //Get list of workout request object
                                                                                                        var workoutRequest = {};
                                                                                                        workoutRequest.url = workoutURL;
                                                                                                        workoutRequest.userid = userid;
                                                                                                        workoutRequest.clubid = clubid;
                                                                                                        workoutRequest.goalid = goalid;
                                                                                                        workoutRequest.gender = gender;
                                                                                                        workoutRequest.experience = experience;
                                                                                                        workoutRequest.durationpreference = durationpreference;
                                                                                                        workoutRequest.frequency = frequency;
                                                                                                        workoutRequest.nextworkoutseq = nextworkoutseq;
                                                                                                        //Add into list
                                                                                                        workoutRequestList.push(workoutRequest);
                                                                                            }

                                                                                        }
                                                                                    }
                                                                                }
                                                                            }
                                                                        }
                                                                    }
                                                                    //Generate workout and add into response if it fails
                                                                    var failedWorkoutRequestsList = [];
                                                                    //call getFailedWorkoutResponse for next workout request
                                                                    module.exports.getFailedWorkoutResponse(req, workoutRequestList, 0, failedWorkoutRequestsList, function (failedWorkoutRequestsList) {
                                                                        //update database for club testing status
                                                                        module.exports.updateClubWorkoutTestStatus(clubid, failedWorkoutRequestsList, function () {
                                                                            //get admin user email id
                                                                            module.exports.getAdminUserEmailId(req, function (email) {
                                                                                //Send email 
                                                                                module.exports.sendEmailForFailedWorkoutResponse(req, clubid, email, workoutRequestList, failedWorkoutRequestsList);
                                                                                //Send response to service
                                                                                if (!Utilities.isEmptyList(failedWorkoutRequestsList)) {
                                                                                    res.json(failedWorkoutRequestsList);
                                                                                } else {
                                                                                    res.json({"message": "No error found in generated workouts :-)"});
                                                                                }
                                                                            });
                                                                        });
                                                                    });

                                                                } else {
                                                                    req.log.error({err: err}, 'Unable to list all durationpreferences data.');
                                                                    res.json({err: "Unable to list all durationpreferences data."});
                                                                }

                                                            });


                                                        } else {
                                                            req.log.error({err: err}, 'Unable to list all durationpreferences data.');
                                                            res.json({err: "Unable to list all durationpreferences data."});
                                                        }

                                                    });

                                                } else {
                                                    req.log.error({err: err}, 'Unable to list all experiences data.');
                                                    res.json({err: "Unable to list all experiences data."});
                                                }

                                            });

                                        } else {
                                            req.log.error({err: err}, 'Unable to list all genders data.');
                                            res.json({err: "Unable to list all genders data."});
                                        }

                                    });

                                } else {
                                    req.log.error({err: err}, 'Unable to list all scheduleconfigfrequencies data.');
                                    res.json({err: "Unable to list all scheduleconfigfrequencies data."});
                                }

                            });
                        } else {
                            req.log.error({err: err}, 'Unable to list all goals data.');
                            res.json({err: "Unable to list all goals data."});
                        }

                    });
                } else {
                    req.log.error({err: err}, 'Unable to list all users data.');
                    res.json({err: "Unable to list all users data."});
                }

            });
        });
    }
};
1。调用此处理的API
//API来验证所有可能的组合
app.get('/api/validateworkout/:clubid',SecurityService.isRestAPIRequestSecure,workoutValidateService.validateGeneratedWorkouts);
2.以下是validateGeneratedWorkouts函数的代码
module.exports={
//为所有用户测试生成的训练,并向管理员团队发送电子邮件
ValidateGeneratedWorkout:功能(请求、恢复){
var clubid=req.params.clubid;
//在数据库中将俱乐部状态更新为“正在进行”
module.exports.updateClubWorkoutTestStatusAsInprogress(clubid,函数(){
//从数据库获取用户数据
var query={};
query.username=”user@validate.com";
documentOperationModule.getDocumentByQuery(查询,常量.USER\u集合,函数(err,用户){
如果(!err&&!Utilities.isEmptyList(用户)){
//从数据库中获取所有目标数据
查询={};
documentOperationModule.getDocumentByQuery(查询,常量.GOAL\u集合,函数(错误,目标){
如果(!err&&!Utilities.isEmptyList(goals)){
//获取所有scheduleconfigfrequencies
查询={};
documentOperationModule.getDocumentByQuery(查询,常量.SCHEDULE\u配置\u频率\u集合,函数(错误,scheduleconfigfrequencies){
if(!err&&!Utilities.isEmptyList(scheduleconfigfrequencies)){
//男女平等
查询={};
documentOperationModule.getDocumentByQuery(查询,常量.GENDERS\u集合,函数(err,GENDERS){
if(!err&&!Utilities.isEmptyList(genders)){
//获得所有经验
查询={};
documentOperationModule.getDocumentByQuery(查询,常量.EXPERIENCES\u集合,函数(err,EXPERIENCES){
if(!err&&!Utilities.isEmptyList(经验)){
//获取所有durationpreferences
查询={};
documentOperationModule.getDocumentByQuery(查询、常量.DURATION\u首选项\u集合、函数(err、durationpreferences){
if(!err&&!Utilities.isEmptyList(durationpreferences)){
//得到所有的俱乐部
查询={};
documentOperationModule.getDocumentByQuery(查询,常数.CLUB_集合,函数(err,clubs){
如果(!err&&!Utilities.isEmptyList(俱乐部)){
var-workoutRequestList=[];
//为每个用户中的每个组合//循环准备训练请求
对于(var i=0;i