Mongoose - Multer 中的 FindOne()
Mongoose - FindOne() inside 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 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.
});
})
它似乎不喜欢我在多重函数中使用多重函数。
有什么建议吗?
你可以把它们分成两个中间件
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){
// ...
});
})
您可以使用 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)
})
}
我正在将 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.
});
})
它似乎不喜欢我在多重函数中使用多重函数。
有什么建议吗?
你可以把它们分成两个中间件
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){
// ...
});
})
您可以使用 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)
})
}