识别关闭内存泄漏

时间:2015-10-09 19:49:12

标签: javascript node.js memory-leaks closures

我正在编写一个简单的api,你发布array(长度= 200)并且因为数组中的每个元素都需要做1-2个查找请求,我正在使用异步库来控制事物的流动。我正在使用节点0.12.5&表达

router.post('/data', function(req, res, next) {

    var cloudDB = db.cloudant.use('events');
    var tempStorage = {"docs": []};

    // This each loop is to make sure all events get iterated through before submitting response
    async.each(req.body, function(singleEvent, loopCallback) {

        // this should be async waterfall or something better to organize it
        async.waterfall(
            [
                function(callback) { // get user data from db
                    db.getUserInfo(singleEvent.email, function (error, dbResponse) {
                        if(error) { // Houston, we have a problem
                            return callback(error);
                        }
                        return callback(null, dbResponse);
                    })
                },
                function(dbResponse, callback) { // decide what to do about results
                    if(!dbResponse) {            // we were unable to get the user from DB
                        db.searchForUser(singleEvent.email, function (err, searchResponse) {
                            if(err)
                                return callback(err);
                            else
                                return callback(null, JSON.parse(searchResponse));
                        })
                    }
                    else {
                        return callback(null,JSON.parse(dbResponse));
                    }
                },
                function(userInfo, callback) { // combine data into proper logic
                    callback(null,combineEventAndUserData(singleEvent,userInfo));
                }
            ],
            function (err, result) {
                // User event has been processed, so if there are no errors, lets add it to the queue
                if(err) {
                    console.log(err);
                }
                else {
                    tempStorage.docs.push(result); 
                }
                loopCallback(); // We're done with this singleEvent
            }
        )
    }, function(err) { // function gets called when all singleEvents have been looped through
        console.log("Finished each");
        if(err) {
            res.status(500).send(err);
        }
        else {
            cloudDB.bulk(tempStorage, function(err, body) {
                if(!err) {
                    res.status(200).send(body);
                }
                else {
                    res.status(500).send(err);
                }
            })
        }
    });
});

所以,这段代码有效!但是......(嗅嗅),我似乎已经造成了内存泄漏。我已经看了memwatch-nextheapdump,而我所能说的就是当我查看堆转储时'数组'继续增长。

我不知道为什么,但我怀疑这可能与闭包有关,以及我如何存储从每个瀑布生成的项目,也许tempStorage.docs没有被释放?我是否以正确的方式存储tempStorage?或者我应该改变我的做法?

0 个答案:

没有答案