【发布时间】:2016-11-20 00:43:18
【问题描述】:
我在 express.js 上使用 jQuery File Upload 和 jquery-file-upload-middleware 和 mongoose 和 mongoDB。
我想上传画廊的图片。 Galery对象包含一个Image对象数组,如
var GalerySchema = new mongoose.Schema({
images: [ImageSchema]
})
每个文件异步上传后,我想将其推送到我的 Galery 对象的 images 数组中。
我尝试做以下服务器端:
// Is called everytime an image is uploaded
upload.on('end', function(fileInfo, rew, res){
// Get the galery
db.Galery.findOne({_id: req.fields.galery_id}, function(err, galery){
// Create new Image object instance
var image = new db.Image({src: fileInfo.name});
// Save, in order to create auto generated _id
image.save(function(err){
if(err) {console.log(err); return; }
// Add to Images array of Galery object
galery.images.push(image);
// Save galery with added image
galery.save(function(err){
if(err) { console.log(err); return; }
});
})
});
});
这样做,我得到了一个众所周知的[VersionError: No matching document found.],据我目前所知,这是由于同时访问同一个 mongodb 文档,因为上传是异步进行的。
所以为了处理异步方式的问题,最好等待所有上传完成,然后使用async.parallel()将图像一一插入到mongodb中。
但是如何访问所有上传已完成的事件?
我知道浏览器端我可以使用stop event。但首先这不包含有关上传文件的任何数据。另外,我想在服务器端做。
有没有类似的东西
upload.on('doneAll', function(allFilesInfo, req, res){...})?
【问题讨论】:
-
你试过用
res吗?res.end('Uploaded') -
我刚刚通过在 jQuery 文件上传属性中设置
sequentialUploads: true找到了一种解决方法,以便一个接一个地上传。不过,我真的很想知道如何异步进行。 -
我不确定您使用哪个库来获取上传的图像。您需要知道最后一张图片的 upload.on('end' 何时被调用。有什么办法知道吗?
-
是的,但我不知道如何获取此事件。如问题中所述,我使用的库是 jquery-file-upload-middleware。它基于 jQuery 文件上传。
-
如果每个上传的请求是分开的和独立的,逻辑上服务器将不知道(也不应该)是否有更多文件。更好的解决方案是让您的客户端在上传完成后执行 ajax/socket 调用,然后这会触发一个服务器路由,该路由在服务器上执行您想要的操作。
标签: jquery node.js mongodb file-upload jquery-file-upload