【问题标题】:Mongoose - FindOne() inside MulterMongoose - Multer 中的 FindOne()
【发布时间】:2017-11-16 09:58:43
【问题描述】:

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

};

我正在将一个新项目保存到我的猫鼬数据库中。现在一切正常。但我想使用 mongoose findOne() 检测重复项,而不仅仅是让 mongoose 在写入数据库时​​处理检测是否存在重复键。因为无论在这个阶段是否存在重复键,我的图像都会被上传。因为它只检测save()上的重复项

现在的问题是,在我的 express 应用程序中,当我使用 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 函数。

有什么建议吗?

【问题讨论】:

  • 您是否尝试使用file filter 并在那里检查重复项?
  • 不,我还没试过。我赶紧去看看。谢谢。
  • @rkm,我需要在数据库中查找重复项,文件过滤器只检查当前数据中的重复字段。
  • 如果您有权访问fileFilter 内的请求数据,您可以签入数据库并根据响应拒绝重复。
  • @rkm 我玩过fileFilter,它解决了我的问题。如果您发布答案,我会接受。谢谢

标签: express mongoose multipartform-data multer


【解决方案1】:

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

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

})

【讨论】:

  • 非常感谢,这实际上看起来很棒。将实施并通知您。
  • 问题是我的upload() 函数中仍然只有req.body.whatever 的范围。所以 Vehicle.findOne() 总是会返回 undefined。
【解决方案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)
        })
}

【讨论】:

  • 谢谢。 fileFilter 为我解决了问题。我唯一遇到的问题是在使用 fileFilter 时,确保在附加我的 formData 时传递文件之前传递了字段。之后,完美!
猜你喜欢
  • 2021-12-04
  • 2015-10-26
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 2021-02-12
  • 2016-10-08
  • 2021-07-12
  • 1970-01-01
相关资源
最近更新 更多