Sequelize+Node.js中Model.create()无法向MySQL保存数据求助
问题描述
使用MySQL、Express.js和Sequelize搭建数据库,模型已创建完成,但调用Model.create()写入数据时无预期效果:
- 页面持续加载无响应
- 控制器中
console.log(req.body)无输出 - 无任何报错信息
- 已确认路由注册正常,怀疑模型或请求处理存在问题
相关代码
Database.js
const { Sequelize } = require("sequelize"); const sequelize = new Sequelize("node-compelet", "root", "********", { dialect: "mysql", host: "localhost", }); module.exports = sequelize;
模型文件 product.js
const sequelize = require("../util/database"); const { Sequelize, DataTypes } = require("sequelize"); const Product = sequelize.define("Product", { id: { type: DataTypes.INTEGER, autoIncrement: true, allowNull: false, primaryKey: true, }, title: { type: DataTypes.STRING }, price: { type: DataTypes.DOUBLE, allowNull: false }, imgUrl: { type: DataTypes.STRING, allowNull: false }, description: { type: DataTypes.STRING, allowNull: false }, }); module.exports = Product;
控制器代码
const Product = require("../models/product") exports.postAddProduct = (req, res, next) => { const title = req.body.title; const imgUrl = req.body.imgUrl; const price = req.body.price; const description = req.body.description; console.log(req.body); Product.create({ title: title, price: price, imgUrl: imgUrl, description: description, }) .then((result) => { console.log("result"); res.redirect("/"); }) .catch((err) => console.log(err)); };
app.js代码
const sequelize = require("./util/database"); const Product = require("../models/product") sequelize .sync({ force: true }) .then((result) => { app.listen(3000); console.log("synced secceed"); }) .catch((err) => { console.log(err); console.log("faild"); });
解决方法
1. 修复请求体解析问题
req.body为空是核心原因——Express默认不解析请求体,需在app.js中添加解析中间件:
// 在app.js顶部补充 const express = require('express'); const app = express(); // 添加请求体解析 app.use(express.urlencoded({ extended: true })); // 解析表单格式请求 app.use(express.json()); // 解析JSON格式请求
缺失解析中间件会导致req.body为空,后续Product.create因必填字段缺失陷入等待,最终造成页面挂起。
2. 检查模型引入路径
app.js中引入Product的路径../models/product需匹配项目目录结构:
- 若
app.js在/src目录,models在/src/models,路径应改为./models/product,路径错误会导致模型未加载,create方法无法执行。
3. 完善错误处理逻辑
在控制器的catch块中添加响应结束逻辑,避免请求挂起:
.catch((err) => { console.log(err); res.status(500).send("数据创建失败"); // 主动结束请求并返回错误信息 });
4. 验证数据库连接
在Database.js末尾添加连接测试,确认数据库连接正常:
sequelize.authenticate() .then(() => console.log("数据库连接成功")) .catch(err => console.log("数据库连接失败:", err));
内容的提问来源于stack exchange,提问作者zahra1996a
相关产品推荐
相关产品推荐

