Express和Mongodb多次插入相同的数据
Express and Mongodb insert same data multiple times
我对Express和Mongodb很陌生。我正在做的项目要求我:
- 取一个包含多个url的对象
- 下载url的内容并保存到云存储
- 为每个保存的文件生成链接
- 将这些链接保存到Mongodb中作为单独的文档
传入的对象看起来像这样:
{
"id" : 12345678,
"attachments" : [
{
"original_url" : "https://example.com/1.png",
},
{
"original_url" : "https://example.com/2.png",
},
{
"original_url" : "https://example.com/3.png",
}
]
}
最终目标是有3个独立的文档像这样保存在mongodb上:
{
"id" : 87654321,
"some_other_data": "etc",
"new_url" : "https://mycloudstorage.com/name_1.png"
}
我有一个像这样的简单循环:
for(var i = 0; i < original_data.attachments.length; i++){
var new_url = "https://example.com/" + i + ".png";
download(original_url, new_url, function(new_url){
console.log(new_url)
new_data.new_url = new_url;
save_new_url_to_mongodb(new_data);
});
}
和保存函数看起来像这样:
function save_new_url_to_mongodb (data, cb) {
getCollection(collection, function (err, collection) {
if (err) {
return cb(err);
}
collection.insert(data, {w: 1, ordered: false}, function (err, result) {
if (err) {
return cb(err);
}
var item = fromMongo(result.ops);
cb(null, item);
});
});
}
var download = function(original_url, new_url, callback){
request.head(original_url, function(err, res, body){
if(res === undefined){
console.log(err);
} else {
var localUrlStream = request(original_url);
var file = bucket.file(new_url);
var remoteWriteStream = file.createWriteStream();
var stream = localUrlStream.pipe(remoteWriteStream);
stream.on('error', function (err) {
next(err);
});
stream.on('finish', function(){
callback(new_url);
});
}
});
};
下载部分很好,我在云存储中得到3个不同的图像文件。console.log也给了我3个不同的新url。
问题是新保存的mongodb文档都有相同的new_url。有时如果原始数据中有更多的original_url,则一些新文档将无法保存。
Thanks to lot
这是您在for循环中分配new_url
的范围问题。JavaScript闭包内部循环-简单的实际例子
一个解决方案是使用Array.Prototype.forEach
,它本质上解决了范围问题,因为每次迭代都会为回调创建一个闭包
original_data.attachments.forEach(function(i) {
var new_url = "https://example.com/" + i + ".png";
download(original_url, new_url, function(new_url){
console.log(new_url)
new_data.new_url = new_url;
save_new_url_to_mongodb(new_data);
});
})
相关文章:
- javascript:将数据库中的数据插入到html5文本字段中
- 使用javascript和jsp将数据插入到融合图中
- 将数据插入android中的SQLite存储时出现异常
- 从Javascript中调用PHP脚本,将数据插入mysql数据库
- Ajax调用正在将数据插入页面的其他位置
- 使用AJAX/PHP让HTML按钮将数据插入MySQL数据库
- 如何用javascript创建三维数组我想把数据插入数组中,这有助于我的代码
- 如何用以下结构定义一个空的javascript对象,以便我可以动态地将数据插入其中
- 将数据插入数据库express/mongodb应用程序时出错
- 如何将json数据插入到表中
- 将API中的数据插入到DOM中
- 将数据插入输入值-AngularJS
- 数据插入有效,但不显示警报框消息
- 如何根据特定条件将数据插入表中
- 将 casper javascript 数据插入 CSV 文件
- 使用Node将帖子数据插入mongoDB
- 如何将键值对中的数据插入到 HTML 中
- 使用 javascript 将数据插入到预成型的 dom 元素中
- 使用 Mongoose 和 Node 将数据插入数组时出错
- Web SQL 将数据插入到多行中