Node.js 图像上载到cloudinary两次
我尝试将AOD图像上传到cloudinary,但当我上传一个图像时,它会上传两次到cloudinary,当我上传2个图像时,它会上传4个等,并返回uploadedFiles=[]。那么我的代码有什么问题 我使用multercloudinary包和multer作为中间件 徖Node.js 图像上载到cloudinary两次,node.js,image,express,multer,cloudinary,Node.js,Image,Express,Multer,Cloudinary,我尝试将AOD图像上传到cloudinary,但当我上传一个图像时,它会上传两次到cloudinary,当我上传2个图像时,它会上传4个等,并返回uploadedFiles=[]。那么我的代码有什么问题 我使用multercloudinary包和multer作为中间件 徖 app.post("/multiple-upload", multerMiddleware.array("files"), async (req, res) => { try {
app.post("/multiple-upload", multerMiddleware.array("files"), async (req, res) => {
try {
if (!req.files) {
return res.status(200).json({ message: "Invalid file type" });
}
let uploadedFiles = imageUploaderHandler({ files: req.files });
return res.status(200).json({ message: "File stored", uploadedFiles });
} catch (error) {
console.log(error);
return res
.status(500)
.json({ message: "Something went wrong while uplaoding this item" });
}
})
const imageUploaderHandler = async ({ files }) => {
let file = {};
let uploadedFiles = [];
let newImages = files.map(async (item) => {
let result = await cloudinary.v2.uploader.upload(item.path)
console.log(result);
file.cloudinaryPublicId = result.public_id;
file.fileUrl = result.secure_url;
file.fileName = result.original_filename;
uploadedFiles.push(file);
});
return await Promise.all(newImages);
};
//Multer-cloudinary config
import cloudinary from "cloudinary";
import { CloudinaryStorage } from "multer-storage-cloudinary";
cloudinary.v2.config({
cloud_name: CLOUD_NAME,
api_key: API_KEY,
api_secret: API_SECRET,
});
let cloudinaryVersion = cloudinary.v2;
const fileStorage = new CloudinaryStorage({
cloudinary: cloudinaryVersion,
folder: "uploads",
filename: (req, file, cb) => {
const date = format(new Date(), "dd-MM-yy");
const fileType = file.mimetype == "video/mp4" ? "VIDEO" : "IMAGE";
const fileNameFormat = `${date}-${fileType}-${file.originalname}`;
cb(null, fileNameFormat);
},
});
const fileFilter = (req, file, cb) => {
if (!file.originalname.match(/\.(jpg|jpeg|gif|png|mp4)$/i)) {
cb(null, false);
} else {
cb(null, true);
}
};
export const multerMiddleware = multer({
storage: fileStorage,
fileFilter,
});
您的编码方法不干净,有很多错误,您可以使用
q
和async
模块解决您的问题,如下所示:
let async = require('async');
let q = require('q');
const imageUploaderHandler = async ({ files }) => {
let defer = q.defer(); // define a defer
let file = {};
let uploadedFiles = [];
async.eachSeries(files, async (item)=>{ //it is a loop
try {
let result = await cloudinary.v2.uploader.upload(item.path)
console.log(result);
file.cloudinaryPublicId = result.public_id;
file.fileUrl = result.secure_url;
file.fileName = result.original_filename;
uploadedFiles.push(file);
} catch (error) {
console.log("something is wrong : ", error)
}
},()=>{
defer.resolve(uploadedFiles) //its callback when finished loop,do something, we want return result as a promise
})
return defer.promise; // this function returns promise
};
因为使用了q
,所以此函数返回promise
,就像在路线中一样:
let uploadedFiles = await imageUploaderHandler({ files: req.files });//use await
检查文档和文档如果您的问题没有解决,请留下评论是的,同样的问题也会发生,没有更改将multerMiddleware添加到问题中我在app.post的第一个(“/multiple upload”)中将multer中间件添加到问题显示控制台.log(req.files)