在Multer里面的Mongoose - FindOne()

时间:2017-06-14 10:02:34

标签: express mongoose multipartform-data multer

我将formData发送到我的快递应用程序,如下所示:

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()函数来获取.post()之后的formData,但似乎没有用。我认为我不能这样做:

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函数。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以使用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)
        })
}

答案 1 :(得分: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){
        // ...
    });

})