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
相关产品推荐
相关产品推荐

