使用Sequelize更新MySQL数据库:NodeJS MVC分类修改功能问询
实现分类修改功能的完整步骤(Node.js + Express + Sequelize + Pug)
嗨,刚接触Node.js和Sequelize的话,这种CRUD里的更新操作确实容易懵,我一步步给你捋清楚怎么实现哈!咱们按照MVC的结构来拆解:
1. 确认你的Category模型(Model)
首先得确保你已经定义了正确的分类模型,假设你的模型文件是models/Category.js,结构大概是这样的:
const { Model, DataTypes } = require('sequelize'); const sequelize = require('../config/database'); class Category extends Model {} Category.init({ title: { type: DataTypes.STRING, allowNull: false }, description: { type: DataTypes.TEXT, allowNull: true } }, { sequelize, modelName: 'Category' }); module.exports = Category;
2. 编写控制器(Controller)逻辑
在controllers/categoryController.js里,需要两个核心方法:一个是加载修改页面,另一个是处理表单提交的更新请求。
2.1 加载修改页面的方法
这个方法负责根据分类ID查询数据,然后渲染modify.pug页面:
const Category = require('../models/Category'); const { validationResult } = require('express-validator'); // 用于验证,后面会用到 // 加载修改页面 exports.getModify = async (req, res) => { try { const categoryId = req.params.id; const category = await Category.findByPk(categoryId); if (!category) { return res.status(404).send('分类不存在'); } res.render('modify', { category }); } catch (err) { console.error(err); res.status(500).send('服务器错误'); } };
2.2 处理更新提交的方法
这个方法接收表单数据,验证后更新数据库,然后重定向回列表页:
// 处理分类更新 exports.postModify = async (req, res) => { try { // 先检查验证错误(后面路由里会加验证规则) const errors = validationResult(req); if (!errors.isEmpty()) { // 如果有错误,返回修改页面并携带错误信息和旧数据 const category = await Category.findByPk(req.body.id); return res.render('modify', { category, errors: errors.array() }); } // 更新分类数据 await Category.update( { title: req.body.title, description: req.body.description }, { where: { id: req.body.id } } ); // 更新成功后重定向到分类列表页 res.redirect('/category/list'); } catch (err) { console.error(err); res.status(500).send('服务器错误'); } };
3. 配置路由(Routes)
在routes/categoryRoutes.js里,配置对应的GET和POST路由,同时可以加上验证规则:
const express = require('express'); const router = express.Router(); const categoryController = require('../controllers/categoryController'); const { body } = require('express-validator'); // 加载修改页面:GET请求,带分类ID参数 router.get('/modify/:id', categoryController.getModify); // 处理更新提交:POST请求,加上验证规则(比如标题不能为空) router.post('/modify', [ body('title').notEmpty().withMessage('分类标题不能为空'), body('id').isInt().withMessage('无效的分类ID') ], categoryController.postModify ); // 别忘了分类列表的路由(假设你已经有了) router.get('/list', async (req, res) => { const categories = await Category.findAll(); res.render('list', { categories }); }); module.exports = router;
然后在你的主app.js里挂载这个路由:
const categoryRoutes = require('./routes/categoryRoutes'); app.use('/category', categoryRoutes);
4. 调整Pug视图
4.1 list.pug里的修改按钮
在分类列表的循环里,给每个分类添加修改按钮,链接到对应的修改页面:
h1 分类列表 ul each category in categories li span= category.title a(href=`/category/modify/${category.id}`) 修改分类
4.2 modify.pug页面
这个页面要显示原有的分类数据,并且提交表单到更新路由,还要处理验证错误提示:
h1 修改分类 // 如果有错误,显示错误信息 if errors div.error each error in errors p= error.msg form(method="POST" action="/category/modify") // 隐藏字段,传递分类ID input(type="hidden" name="id" value=category.id) div label(for="title") 分类标题: input(type="text" name="title" id="title" value=category.title required) div label(for="description") 分类描述: textarea(name="description" id="description")= category.description button(type="submit") 保存修改 a(href="/category/list") 返回列表
一些额外提示
- 记得安装所需的依赖:
express-validator是用来做表单验证的,执行npm install express-validator即可。 - 错误处理可以更友好,比如把错误信息传到视图里用更美观的方式展示,而不是直接send文本。
- 可以给路由加上权限验证(如果需要的话),防止未授权用户修改分类。
内容的提问来源于stack exchange,提问作者Charlote22
相关产品推荐
相关产品推荐

