Я использую экспресс-сервер и мультитер для загрузки файлов на разные сервисы (локальные, лазурные, облачные, amazon s3 и т. Д.).
Для этого я использую различные модули multer multer-azure, multer-cloudinary и т. Д.
Мне нужно, чтобы эта конфигурация применялась для пользователей и эта информация поступала из базы данных.
Поэтому мне нужен дополнительный вызов для извлечения данных из базы данных, прежде чем Multer вступит в действие.
Я могу вызвать запрос к базе данных, но когда я пытаюсь вызвать функцию multer
, параметр req
становится пустым. Вот что я делаю.
var multerUtility = require('./upload/multer.utility');
let multer = new multerUtility().getActiveMulterService();
router.post('/', getMetadataConfiguration, multer, (req, res, next) => {
console.log('========== req ==========', req.file); // It is coming blank
console.log('========== req ==========', req.body); // It is coming blank
});
Вот первая функция промежуточного программного обеспечения, которая извлекает данные из базы данных, чтобы проверить, какая служба будет использовать для загрузки файла.
function getMetadataConfiguration(res, req, next) {
var conn = new jsforce.Connection({
loginUrl : config.org_url,
});
var records = [];
conn.login(username, password, function(err, userInfo) {
if (err) {
return console.error(err);
}
conn.query("query", (err, result) => {
if(err) {
res.status(500).send(err);
}
console.log('=========== result=========', result);
req.serviceConfig = result.records[0];
next();
});
});
}
А вот мой класс MulterUtility для обработки конфигурации:
upload/multer.utility.js
class MulterUtility {
constructor() {
}
getActiveMulterService(req, res, next) {
var multerConfiguration;
if(req.serviceConfig.service == 'azure') {
multerConfiguration = multer({
storage: multerAzure({
connectionString: config.azure.connectionString,
account: config.azure.account,
key: config.azure.key,
container: config.azure.container
})
}).single('image');
} else if(req.serviceConfig.service == 'cloudinary') {
multerConfiguration = multer({
storage: cloudinaryStorage({
cloudinary: cloudinary,
folder: config.storageFolder
// allowedFormats: ['jpg', 'png', 'jpeg']
})
}).single('image');
} else if(req.serviceConfig.service === 'amazon') {
multerConfiguration = multer({
storage: multerS3({
s3: s3,
bucket: 'mycontainer',
acl: 'public-read',
contentType: multerS3.AUTO_CONTENT_TYPE,
metadata: function (req, file, cb) {
cb(null, {fieldName: file.fieldname});
},
key: function (req, file, cb) {
cb(null, Date.now().toString() + '-' + file.originalname)
}
})
}).single('image');
} else if(req.serviceConfig.service === 'local') {
multerConfiguration = multer({
storage: multer.memoryStorage()
}).single('image');
}
return multerConfiguration;
}
}
module.exports = MulterUtility;
После выполнения multer я не получаю параметры req.file или req.body, которые устанавливает multer после загрузки файла.
На данный момент вы можете рассмотреть загрузку локального файла, как указано в последнем условии.