NodeJS: Querying MS SQL in loop freezes response

做~自己de王妃 提交于 2019-12-11 17:14:12

问题


I am using fetch to read data from API build in NodeJS. I have the following method:

exports.read_detail = async function(req, res) {
    try {

        let pool = await new sql.ConnectionPool(config).connect();

        pool.on('error', err => {
            console.log("Pool Error");
            console.log(err);
        })

        let resultDcn = await pool.request()
            .input('DcnId', sql.Int, parseInt(req.body.DcnId))
            .query('SELECT * FROM Dcn WHERE DcnId = @DcnId');

        if(resultDcn.rowsAffected[0]) {

            var DCNObj = resultDcn.recordset[0];

            let resultDcnDay = await pool.request()
                .input('DcnId', sql.Int, parseInt(DCNObj.DcnId))
                .query('SELECT DcnDayId, DcnDate FROM DcnDay WHERE DcnId = @DcnId');

            let timeClocks = [];
            let myActivities = [];
            for (var i = 0; i < resultDcnDay.recordset.length; i++) {

                let dcnDayId = resultDcnDay.recordset[i].DcnDayId;
                console.log("Day: " + dcnDayId);

                /*Get Time Clocks per day*/
                let resultDcnTimeClocks = await pool.request()
                    .input('DcnDayId', sql.Int, parseInt(dcnDayId))
                    .query('SELECT * FROM DcnDayTimeClock WHERE DcnDayId = @DcnDayId');
                console.log(resultDcnTimeClocks.recordset);
                timeClocks.push(resultDcnTimeClocks.recordset);

                /*Get Activities per day*/
                let resultDcnDayActivity = await pool.request()
                    .input('DcnDayId', sql.Int, parseInt(dcnDayId))
                    .query('SELECT DcnDayActivity.*, DcnDay.DcnDate FROM DcnDayActivity INNER JOIN DcnDay ON DcnDayActivity.DcnDayId = DcnDay.DcnDayId WHERE DcnDayActivity.DcnDayId = @DcnDayId');
                console.log(resultDcnDayActivity.recordset);
                myActivities.push(resultDcnDayActivity.recordset);
            }

            const DcnDto = {
                "Dcn": DCNObj,
                "timeClocks": timeClocks,
                "dayActivities": myActivities
            };

            res.status(200).send({data: DcnDto});

        } else {
            res.status(200).send({msg: 'DCN does not exist'}); 
        }  

    } catch(err){
        console.log("Error: ", err);
        res.status(400).send({msg: 'error ocurred: ' + err});
    }
}

I am guessing error has to do with the object returned, since if I remove a node like dayActivities or Dcn, response is returned ok. Dcn has like 12 attributes.

Is there a limit on a object being returned? or any other limit or format I should know about?


回答1:


I think the problem is that myActivities only exists within the scope of the if(resultDcn.rowsAffected[0]).

At this point the program crash.

const DcnDto = {
  "Dcn": DCNObj,
  "timeClocks": timeClocks,
  "dayActivities": myActivities
};

Recommendation: When you use async/await I suggest using a try catch.



来源:https://stackoverflow.com/questions/57662891/nodejs-querying-ms-sql-in-loop-freezes-response

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!