簡體   English   中英

藍鳥與貓鼬使用Promise.Each

[英]Bluebird with mongoose using Promise.Each

我陷入了我正在使用的函數中(我可能做錯了一切)。 因此,快速解釋一下,我想在集合中添加批量數據,該集合稱為“站點”,CSV的格式是站點,國家,類型。 我正在為此使用諾言(藍鳥)。 因此,請考慮以下代碼:

 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: ''});

我正在進行ajax調用,所以我返回一個res.send({status:'ok',message:``}}),我知道它的位置不正確,我想沿着res.send發送一些數據。 當前,它在代碼實際完成之前發送標頭。 我想在Mongo中添加所有數據后發送頭,但是對於這種情況下的每個頭,他都解析(),所以如果我在“ .each”的“ .then”內發送頭,我將得到已經發送的頭錯誤。

這可能有點令人困惑。 我覺得我做錯了。 我要瘋了,也找不到適合我理解和實施的例子。

但是最后,我的主要問題是:使用Ajax調用是一種正確的方法,即使用諾言在集合中添加1000條記錄,並實際上正確地控制那些未能添加的人和那些沒有添加的人?

現在,我的代碼實際上可以工作,但是邏輯肯定是錯誤的。

謝謝。

您可以在模型上使用bulkWrite

參考: http : //mongoosejs.com/docs/api.html#model_Model.bulkWrite

編輯:

對不起,我誤會了你。 您需要移動res.send({ status: 'ok', message: ''}); then()catch()塊,因此您將獲得如下內容:

Promise.each(sites, sites => new Promise((resolve, reject) => {
    // stuff you did before
}).then((data) => {
    console.log('All websites processed!');
    addedSites.push(data);
    res.send({ status: 'ok', message: ''});
}).catch(err => {
    res.send({ status: 'failed', message: err.message});
}));

如果有人可以告訴我這是否是一個很好的拱門,這也是我來的。

    exports.addBulkSite = function(req, res, next) {
    let siteArray = csv.parse((req.body.sites).trim()),
        addedSites = [],
        failedSites = [],
        duplicated = [],
        sites = siteArray,
        size = sites.length,
        processed = 0,
        meta;
    Promise.each(sites, sites => new Promise((resolve, reject) => {
        let name = tools.extractDomain(req, res, sites[0]),
            country = sites[1],
            group = sites[2];
        if (name != "" && country != "" && group != "") {
            Site.findOneAsync({ name: name }, "_id").then(function(duplicate) {
                duplicated.push(duplicate);
                reject({name:name, message: 'Duplicated', critical:false});         
             }).catch(function(notDuplicated){
                let site = new Site()
                site = { 
                            name: name, 
                            meta: {}, 
                            group: group, 
                            country: country, geomix:{}, 
                            addedBy: req.user._id,
                            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(e);
                    reject({name:name, message: 'Error saving in the database. Please contact the administrator.', critical: true});
                });  
            });
        }else{
            reject({name:name, message: 'Paramaters are missing', critical:false});
        }
    }).then((data) => {
          processed++;
          addedSites.push(data);
          if(processed==size){
            console.log('out');
            res.send({ status: 'ok', addedSites: addedSites, failedSites: failedSites, duplicated: duplicated});
          }
    }).catch((err) => {
          processed++;
          console.log(err);
          failedSites.push(err);
          if(processed==size){
            console.log('out');
            res.send({ status: 'ok', addedSites: addedSites, failedSites: failedSites, duplicated: duplicated});
          }
    })); 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM