2016-03-20 3 views
0

Я пытаюсь сохранить информацию о форме в db mongoose вместе с загрузкой файла. Я пробовал различные примеры, но похоже, что опция 'onFileUploadComplete' была удалена. Вот код ниже:NPM Multer, альтернатива onFileUploadComplete

router.post('/info', function(req, res, next){ 
    multer({ storage: 
     multer.diskStorage({ 
      destination: function(req, file, callback){ 
       var path = "./public/assets"; 
       switch(req.body.type) 
       { 
        case 'link': path += '/link'; break; 
        case 'PDF': path += '/PDF'; break; 
        case 'video': path += '/video'; break; 
        case 'audio': path += '/audio'; break; 
        case 'image': path += '/image/' + req.body.folder; break; 
       } 
       callback(null, path); 
      }, 
      filename: function(req, file, callback){ 
       callback(null, file.originalname); 
      } 
     }), 
     onFileUploadComplete: function(req, file, callback){ 
      var asset = new Asset(req.body); 
      asset.save(function(err, asset){ 
       if(err) 
        return next(err); 

       return next(); 
      }); 
     } 
    }).single('file')(req, res, function(err){ 
     if(err) 
      return res.send("Err: "+ err); 

     res.render('uploads', {authorised: true}); 
    }); 
}); 

Есть ли альтернативный способ загрузить файл в указанном месте, и сохранить информацию о форме (req.body) в БД.

Любая помощь приветствуется, Спасибо

ответ

1

Вы можете получить доступ к читаемую файловый поток через file.stream. Таким образом, вы могли бы file.stream.on('end', ...) знать, когда файл закончил быть читать. Если вы хотите узнать, действительно ли файл закончил писать на диск, вам нужно сделать что-то немного более взломанное: file.stream._readableState.pipes.on('finish', ...).

Однако, если вы хотите сохранить req.body после завершения файла, почему бы просто не сделать это в своем обработчике маршрутов или, возможно, написать обычное промежуточное программное обеспечение, которое обертывает промежуточное программное обеспечение multer, которое выполняет обе эти функции в одно промежуточное ПО. Например:

function myUpload(multUpload) { 
    return function(req, res, next) { 
    multUpload(req, res, function(err) { 
     if (err) return next(err); 
     // Save `req.body` to database here, then call `next()` 
    }); 
    }; 
} 

и использовать его как:

// Here `upload === multer({ ... })` 
router.post('/info', myUpload(upload.single('file')), function(req, res, next) { 
    if (err) 
    return res.send("Err: "+ err); 

    res.render('uploads', {authorised: true}); 
});