2017-06-14 88 views
0

我送FORMDATA我明确的应用程序,像这样:猫鼬 - FindOne()内Multer

itemFactory.saveItem = function(item, callback){ 

    var formData = new FormData(); 

    for(var i = 0; i < item.photos.length; i++){ 
     formData.append('photos', item.photos[i]); 
    }  
    for(var key in item){ 
     formData.append(key, item[key])  
    } 

    return $http.post('/api/item/', formData, { 
     transformRequest: angular.identity, 
     headers: { 'Content-Type': undefined } 
    }).success(callback); 

}; 

我保存到我的猫鼬DB的新项目。现在一切都运转良好。但是我想使用mongoose findOne()来检测重复项,而不仅仅是让mongoose处理检测写入数据库时​​是否存在重复密钥。因为无论在这个阶段我的图片都会上传,如果有重复的密钥存在或不存在。因为它只检测到save()

现在的问题,在我的快车应用程序中,当我使用findOne()时,Multer()尚未解码我的formData。例如:

router.post('/item', function(req, res){ 
    Vehicle.findOne({ id: String(req.body.id) }, function(error, item){ 

     var storage = multer.diskStorage({...}) 
     var upload = multer({ 
         storage: storage 
        }).any(); 

     upload(req, res, function(error){ 
      //formData is only available here via req.body 
      //and not at findOne() stage. 
     }); 

    }); 
}); 

我不能做findOne上传里面,因为这样的文件将被上传无论如何,然后只检测一个副本。

我尝试了另一个multer().any()函数获取formData刚好在.post()后但似乎没有工作。我不认为我能做到这一点:

var detectItem = multer().any() 
detectItem(req, res, function(){ 

    Vehicle.findOne({ id: String(req.body.id) }, function(error, item){ 

     var storage = multer.diskStorage({...}) 
     var upload = multer({ 
         storage: storage 
        }).any(); 

     upload(req, res, function(error){ 
      //formData is only available here via req.body 
      //and not at findOne() stage. 
     }); 

}) 

它似乎并不喜欢我在一个multer函数内使用一个multer函数。

有什么建议吗?

+1

你尝试使用[文件过滤器(https://github.com/expressjs/multer#filefilter)和重复检查呢? – rkm

+0

不,我还没有尝试过。我很快会去看看。谢谢。 –

+0

@rkm,我需要在数据库中找到重复项,文件筛选器只检查当前数据中的重复字段。 –

回答

1

您可以使用fileFilter选项来控制哪些文件被接受。

这可能是这样的:

function filFilter (req, file, cb) { 
    Vehicle 
     .findOne({ id: req.body.id }) 
     .then(item => { 
      cb(null, !item); // Skip if item exists (passing false skips file) 
     }) 
} 
+0

谢谢。 fileFilter为我做了诡计。我唯一遇到的问题是使用fileFilter的时候,在追加我的formData时,确保在传递文件之前传递了字段。之后,完美! –

0

你可以将它们分开成两个中间件

app.post('/item', function(req, res, next){ 

    //this middleware is used to check duplicate 

    Vehicle.findOne({id:req.body.id}).then(function(item){ 
     if(item) res.end() //if item existed, send response directly 
     else next() //if item not existed, continue to next middleware 
    }) 

}, function(req, res){ 

    var storage = multer.diskStorage({...}) 
    var upload = multer({ storage: storage }).any(); 

    upload(req, res, function(error){ 
     // ... 
    }); 

}) 
+0

非常感谢,这实际上看起来不错。将执行并让你知道。 –

+0

问题是,我的upload()函数中仍然只有req.body.whatever的范围。所以Vehicle.findOne()总是会返回undefined。 –