Express Mongoose-FindOne()在Multer内
我正在将formData发送到我的express应用程序,如下所示: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
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时先传递字段,然后再传递文件。在那之后,完美!