[英]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.