Node.js+Multer上传图片存MySQL报image cannot be an array or an object错误怎么解决
错误原因
你的Post数据库表的image字段定义为字符串类型,最终传入ORM创建方法的数据里image字段是对象/File类型,不符合字段约束,触发报错:
string violation: image cannot be an array or an object
问题出在前后端三处错误,依次修复即可:
1. 前端代码修复
你虽然创建了FormData,但完全没有实际使用,带文件上传的请求必须传递FormData对象,不能传普通JSON对象,所有字段都需要塞进FormData里:
const userId = props.credentials?.user.id const formdata = new FormData(); // 所有参数都append到FormData中 formdata.append('image', image); formdata.append('title', title); formdata.append('content', content); formdata.append('userName', post.name); formdata.append('lastName', post.lastName); formdata.append('date', new Date()); formdata.append('userId', post.user.id); formdata.append('token', post.token); // 直接传递FormData给请求方法 const addPost = (body) => dispatch(createPostAction(body)); addPost(formdata);
注意:如果你的请求库是axios/fetch,不需要手动设置Content-Type: multipart/form-data,浏览器会自动识别FormData并添加请求头,手动配置反而会导致边界符丢失报错
2. 后端路由代码修复
你需要将Multer解析后的文件路径(字符串)拼接进帖子数据里,再传入控制器,不要分开传两个参数:
//My route router.post("/", authenticate, fileUpload, async(req, res) => { try { const postData = req.body; // 存在上传文件时,将文件的访问路径赋值给image字段,路径规则和你Multer的存储配置保持一致 if(req.file) { // 示例:如果你配置Multer把文件存在public/upload目录下,就填对应的可访问路径 postData.image = `/upload/${req.file.filename}`; } res.json(await postControllers.makePost(postData)) } catch (error) { return res.status(500).json({ message: error.message }); } });
3. 控制器代码无需修改
修复后传入Post.create的image字段就是符合要求的字符串路径,不会再触发类型校验错误。
内容的提问来源于stack exchange,提问作者Alejandro Urbina
相关产品推荐
相关产品推荐

