Wednesday 31 May 2017

Bluebird with mongoose using Promise.Each

I've quite new working with node env, I'm quite stuck in a function I'm working with ( I can be doing this all wrong ). So a quick explanation, I want to add bulk data in a collection, the collection is called "Sites" the format of the CSV is site,country,type. I'm trying to use promises for this (Bluebird). So consider the code:

 Promise.each(sites, sites => new Promise((resolve, reject) => {
    //console.log(sites);
    let name = tools.extractDomain(req, res, sites[0]);
    let country = sites[1];
    let group = sites[2];
    if (name != "" && country != "" && group != "") {

        Site.findOne({ name: name }, "_id", function(err, duplicate) {
            if (false) {
                console.log("Duplicate site: " + duplicate);

            } else { 
                   //console.log("Adding " + name)
                let site = new Site()
                site.name = name
                site.meta = {}
                site.group = group
                site.country = country
                site.geomix = []
                site.addedBy = req.user._id
                site.addedAt = Date.now()
                site.saveAsync().then(function(response){
                    tools.saveHistory(req, res, response._id, response.name, "Website Meta fetched.");
                    tools.saveHistory(req, res, response._id, response.name, "Link added for the first time."); //Save in history 
                    resolve(site);
                }).catch(function (e){
                    console.log(name);
                    reject();
                });  
            }
         });

    }else{
        console.log('Wrong Format');
    }
}).then((data) => {
      console.log('All websites processed!');
      addedSites.push(data);
}).catch(err => {
      //console.error('Failed');
}));

    res.send({ status: 'ok', message: ''});

Im making ajax calls so I return a res.send({ status: 'ok', message: ''}), I know that's in the incorrect place and I want to send some data along the res.send. Right now he send the headers before the code actually finish. I want to send the headers after all data is added in Mongo but for every each in this case he resolve() so if I send the headers inside the ".then" of the ".each" I will get headers already sent error.

This might be a bit confusing as even me is confused and I feel I'm not doing this right. I'm going a bit crazy as well as I can't find a proper example that I can understand and implement.

But in the end my main question is. Using an Ajax call whats the proper way to add let's say 1000 records in a collection using promises and actually controlling properly those who fail to add and those who don't.

Right now my code actually works but the logic is wrong for sure.

Cheers guys.



via DanielPanic

No comments:

Post a Comment