Express、Nodejs 为不同的服务使用 Multer
Express, Nodejs use Multer for different Services
我正在使用 express server 和 multer 在不同的服务(本地、azure、cloudinary、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 Class 来处理配置:
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 设置的参数。
现在您可以考虑上一个条件中提到的 'local' 文件上传。
您好,这个问题已经基本得到解答。解决方案是在此过程中手动将文件对象添加回 req.body 对象。
找到完整的解决方案
问题是你在路由器之前调用了方法getActiveMulterService
一次。但是你需要为每个 post
调用它。尝试这样的事情:
var multerUtility = require('./upload/multer.utility');
let multers = new multerUtility();
router.post('/',
getMetadataConfiguration,
(req, res, next) => multers.getActiveMulterService(req, res, next)(req, res, next),
(req, res, next) => {
console.log('========== req ==========', req.file); // It is coming blank
console.log('========== req ==========', req.body); // It is coming blank
});
并且在这个函数中你的参数顺序错误:
getMetadataConfiguration(res, req, next)
// ==>
getMetadataConfiguration(req, res, next)
我正在使用 express server 和 multer 在不同的服务(本地、azure、cloudinary、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 Class 来处理配置:
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 设置的参数。 现在您可以考虑上一个条件中提到的 'local' 文件上传。
您好,这个问题已经基本得到解答。解决方案是在此过程中手动将文件对象添加回 req.body 对象。
找到完整的解决方案
问题是你在路由器之前调用了方法getActiveMulterService
一次。但是你需要为每个 post
调用它。尝试这样的事情:
var multerUtility = require('./upload/multer.utility');
let multers = new multerUtility();
router.post('/',
getMetadataConfiguration,
(req, res, next) => multers.getActiveMulterService(req, res, next)(req, res, next),
(req, res, next) => {
console.log('========== req ==========', req.file); // It is coming blank
console.log('========== req ==========', req.body); // It is coming blank
});
并且在这个函数中你的参数顺序错误:
getMetadataConfiguration(res, req, next)
// ==>
getMetadataConfiguration(req, res, next)