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

Node.js用Multer传图至SQL报错:error column cannot be null求助

问题排查:Multer文件上传失败+“column cannot be null”报错

核心错误点及修复步骤


1. Multer配置拼写错误

你的路由代码里把storage拼写成了storange,这会导致Multer无法正确初始化文件存储配置,最终req.file会是undefined,进而gambar参数为空,触发数据库非空约束报错。

修复:
把路由代码里的storange全部改成storage:

// 修正拼写错误:storange -> storage
const storage = multer.diskStorage({
    destination: './uploads',
    filename: (req, file, cb) => {
        return cb(null, `${file.fieldname}_${Date.now()}${path.extname(file.originalname)}`)
    }
})

const upload = multer({
    storage: storage // 这里也修正拼写
})

2. Controller中文件获取方式错误

req.file.gambar是错误的写法,Multer的req.file对象不存在gambar属性。根据你的需求(存储到SQL),通常有两种选择:

  • 存储文件路径:使用req.file.path
  • 存储二进制数据:使用req.file.buffer(需确保数据库对应字段类型为BLOB)

同时建议添加调试日志,确认是否获取到文件和表单数据:

const addgambar = (req,res) => {
    // 调试打印,确认数据是否正常接收
    console.log('表单数据:', req.body);
    console.log('上传文件:', req.file);

    const idimg = req.body.idimg;
    // 用可选链避免req.file为undefined时报错
    const gambar = req.file?.path; 

    // 提前校验必填参数
    if (!idimg || !gambar) {
      return res.status(400).send({ message: "idimg和图片文件不能为空" });
    }

    // 注意SQL语句里是VALUES不是VALUE
    const sqlQuery = "INSERT INTO image (idimg,gambar) VALUES (?,?)";
    
    db.query(sqlQuery, [idimg,gambar], (err, result) => {
      if (err) {
        res.status(500).send({
            message: "插入失败",
            err
        })
      } else {
        res.send({
            message: "图片上传成功"
        })
      }
    });
};

3. SQL表名不匹配

你的查询接口查的是gambar表,但插入接口操作的是image表,需确认数据库实际表名,避免因表名错误导致的异常。

4. 额外注意:确保uploads目录存在

Multer不会自动创建./uploads目录,启动服务前需手动创建该文件夹,否则会出现文件写入失败的错误。

Postman测试注意事项

  • 请求方式选POST,请求体类型选form-data
  • 文件字段的键名必须和upload.single('gambar')中的gambar一致,字段类型选择File后再选择本地图片
  • 同时添加idimg表单字段并填写有效值,避免触发数据库非空约束

内容的提问来源于stack exchange,提问作者Recometa 5094

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:30:59