Express Mongoose-FindOne()在Multer内

Express Mongoose-FindOne()在Multer内,express,mongoose,multipartform-data,multer,Express,Mongoose,Multipartform Data,Multer,我正在将formData发送到我的express应用程序,如下所示: 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 k

我正在将formData发送到我的express应用程序,如下所示:

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);

};
我无法在上传中完成findOne,因为这样文件无论如何都会被上传,然后只检测到重复

我尝试了另一个
multer()。我想我做不到:

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


有什么建议吗?

你可以把它们分成两个中间包

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){
        // ...
    });

})

你可以把它们分成两个中间产品

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){
        // ...
    });

})
您可以使用选项来控制接受哪些文件

可能是这样的:

function filFilter (req, file, cb) {
    Vehicle
        .findOne({ id: req.body.id })
        .then(item => {
            cb(null, !item); // Skip if item exists (passing false skips file)
        })
}
您可以使用选项来控制接受哪些文件

可能是这样的:

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

你试过在那里使用和检查副本吗?没有,我还没有试过。我马上去看一看。谢谢。@rkm,我需要在数据库中查找重复项,文件筛选器只检查当前数据中的重复字段。如果您有权访问
fileFilter
中的请求数据,您可以在数据库中进行检查,并根据响应拒绝重复项。@rkm我使用了fileFilter,它解决了我的问题。如果你给出答案,我会接受。谢谢你试着在那里使用和检查副本吗?不,我还没有试过。我马上去看一看。谢谢。@rkm,我需要在数据库中查找重复项,文件筛选器只检查当前数据中的重复字段。如果您有权访问
fileFilter
中的请求数据,您可以在数据库中进行检查,并根据响应拒绝重复项。@rkm我使用了fileFilter,它解决了我的问题。如果你给出答案,我会接受。谢谢谢谢,真的很好看。问题是我的upload()函数中仍然只有req.body.whatever的作用域。所以Vehicle.findOne()总是返回未定义的。太棒了,谢谢,这看起来真的很棒。问题是我的upload()函数中仍然只有req.body.whatever的作用域。所以Vehicle.findOne()总是返回未定义的。谢谢。fileFilter帮了我的忙。我遇到的唯一问题是在使用fileFilter时,确保在附加formData时先传递字段,然后再传递文件。在那之后,完美!非常感谢。fileFilter帮了我的忙。我遇到的唯一问题是在使用fileFilter时,确保在附加formData时先传递字段,然后再传递文件。在那之后,完美!