Postman发送form-data失败,Sequelize返回value cannot be null错误
问题解决:form-data请求时Sequelize报
value cannot be null 核心问题1:中间件顺序错误
你的express-fileupload中间件挂载在路由之后,导致路由处理请求时,form-data还未被解析,req.body是空对象,从req.body解构的brandId、typeId等字段全为undefined,传给Sequelize创建模型时触发非空校验错误。
修正后的index.ts:
将fileUpload中间件移到路由挂载之前:
import express from "express"; import fileUpload from "express-fileupload" // ...其他导入代码 const app = express() const PORT = process.env.PORT || 5100 app.use(cors()) app.use(express.json()) // 先挂载文件解析中间件,再处理路由 app.use(fileUpload({})) app.use('/api', router) app.use(errorHandler) const start = async () => { try { await sequelize.authenticate() await sequelize.sync() console.log(chalk.cyanBright('Successful conection to data base')); app.listen(PORT, () => { console.log(chalk.cyanBright(`Server has been started on port ${PORT}`)) }) } catch (e) { console.log(e); } } start()
核心问题2:UUID生成写法错误
控制器里的filename把uuid.v4()写成了字符串字面量,不会生成实际UUID,需要调用函数生成:
// 先确保导入uuid包 import { v4 as uuidv4 } from 'uuid'; // 修正文件名生成逻辑 let filename = uuidv4() + '.jpg'
额外注意事项
- 检查Sequelize模型中
brandId、typeId、name、price字段的allowNull配置,如果是false,必须确保Postman的form-data里确实传了这些字段,且键名与代码解构的完全一致(大小写敏感)。 - 增加文件存在校验,避免空文件导致的错误:
if (!img) { return next(ApiError.badRequest('请上传图片')) } img.mv(path.resolve(__dirname, '..', 'static', filename))
内容的提问来源于stack exchange,提问作者Aaaaaaaaa Aaaaaaaaa
相关产品推荐
相关产品推荐

