You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:45:01