节点js应用程序占用大量内存

时间:2018-08-03 09:03:50

标签: javascript node.js

我使用NodeJ为我的移动应用程序构建了一个API。我构建了此应用程序以将联系人添加到Mongo数据库,但是该应用程序占用了过多的内存。

var ObjectID = require('mongodb').ObjectID

module.exports = function(app, db) {
const myDb = db.db('sycontacts') 
app.post('/addcontacts', (req, res) => {
    const jason = JSON.parse(req.body.body);
    jason.forEach(function(value){

        const contact = { n: value.n, p: value.p };
        const details = { p: value.p };
        var bool = true;
        myDb.collection('contacts').find(details).toArray(function(err, item) {
        if (err) {
           res.send({ 'error': 'An error has occured' });
        } else {
            if(item.length>0){
               item.forEach(function(value){
                if(value.n == contact.n){ 
                    bool= false;
                    return;
                }
                if(!bool)return;
               });
                if(bool){
                myDb.collection('contacts').insertOne(contact, (err) => {
                        if (err) {
                            res.send({ 'error': 'An error has occured' });
                        } 
                    });
                }

            }else {
                myDb.collection('contacts').insertOne(contact, (err) => {
                    if (err) {
                        res.send({ 'error': 'An error has occured' });
                    } 
                });

            }

        }
    });

});
    res.send('findEd');

});
};

我的数据库有大约5000000个文档。有人可以帮助我使该应用程序更好地运行并减少其内存使用吗?

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些错误,并且缺少一些优化措施:

  • 您在forEach函数中执行了异步函数,要使用async.eachOf或async.eachOfLimit来循环使用异步函数
  • 您检索数据库中的所有文档以插入丢失的文档

改为执行以下操作:

var async = require("async");

const jason = JSON.parse(req.body.body);

// process 10 document in same time at maximum
async.eachOfLimit(jason, 10, function(value, index, callback){

    // upsert document, update all or insert if match not found
    myDb.collection('contacts').update({ n: value.n, p: value.p }, {n: value.n, p: value.p}, {multi: false, upsert: true}, function(err){

        return callback(err);

    });

}, function(err, result){

    // all is finished
    if(err)
    {
        return res.status(500).json({err: err});
    }
    else
    {
        return res.status(200).json({err: null});
    }
})