无法将src目录临时文件通过Multer上传至Cloudinary求助
问题排查与修复方案
核心问题分析
混用
await与.then()导致result未赋值
你同时用了await和.then()链式调用,但.then()里没有返回结果,导致await拿到的是undefined,这是获取不到Cloudinary返回值的直接原因。文件路径不匹配
从req.file输出看,文件存在uploads/目录,但删除时你用的是../temp/${req.file.filename},路径不一致会导致删除失败甚至报错。错误捕获逻辑失效
你在.catch()里仅打印错误信息,没有抛出异常,外层try/catch无法捕获上传失败的情况,无法触发错误响应。Cloudinary初始化验证
先确认已正确配置Cloudinary凭证:cloudinary.config({ cloud_name: '你的Cloud名称', api_key: '你的API密钥', api_secret: '你的API密钥' });
修复后的代码示例
console.log("file detail:", JSON.stringify(req.file)) //output {"fieldname":"avatar","originalname":"Screenshot 2024-07-27 004034.png","encoding":"7bit","mimetype":"image/png","destination":"uploads/","filename":"Screenshot 2024-07-27 004034.png","path":"uploads\\Screenshot 2024-07-27 004034.png","size":474631} if (req.file) { try { // 移除.then().catch(),用try/catch统一处理异常 const result = await cloudinary.v2.uploader.upload(req.file.path, { folder: "learnify", width: 250, height: 250, gravity: "faces", crop: "fill", }); console.log('RESULT', result); if (result) { user.avatar.public_id = result.public_id; user.avatar.secure_url = result.secure_url; // 修正删除路径,使用req.file.path确保匹配文件实际位置 await fs.rm(req.file.path); // 用await确保删除操作完成 } } catch (error) { console.error('Cloudinary上传错误:', error.message); return next(new AppError("File not upload, please try again", 500)); } }
额外注意事项
fs.rm要加await,避免文件未上传完成就被删除,或删除操作未结束就执行后续逻辑。- 检查
uploads目录权限,确保Node.js进程有读取文件的权限。 - Windows系统下的路径分隔符
\\是正常的,Cloudinary可以识别。
内容的提问来源于stack exchange,提问作者Harshit Sharma
相关产品推荐
相关产品推荐

