蓝猫与使用Promise.Each的猫鼬

时间:2017-05-31 08:37:14

标签: javascript node.js mongodb promise bluebird

我陷入了一个我正在使用的功能中(我可能做错了)。所以快速解释一下,我想在集合中添加批量数据,该集合称为“站点”,CSV的格式是站点,国家/地区,类型。我正在尝试使用promises(Bluebird)。所以考虑一下代码:

 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发送一些数据。发送。目前,它在代码实际完成之前发送标头。我想在Mongo中添加所有数据之后发送标题但是在这种情况下每个都解析()所以如果我在“.each”的“.then”内发送标题我会得到标题已发送错误

这可能有点令人困惑。我觉得我做得不对。我有点疯狂,我找不到一个能理解和实施的正确例子。

但最后我的主要问题是:使用Ajax调用是什么正确的方法来添加使用promises在集合中添加1000个记录并实际控制那些未添加的人和那些不添加的人?

现在我的代码确实有效,但逻辑肯定是错误的。

感谢。

2 个答案:

答案 0 :(得分:0)

您可以在模型上使用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});
}));

答案 1 :(得分:0)

这也是我来的,如果有人能告诉我这是否是一个好的拱门。

Class X{
    private String name;
    private List<Y> ypojo;
    //getters and setters
}

Class Y
{
    private String stat;
    private String nu;
    //getters and setters
}