Sequelize+Express中Page模型sort方法报错,插入正常查询异常求助
问题排查:Sequelize中
sort is not a function错误解决 嘿,我一眼就发现问题啦——你混用了Mongoose(MongoDB的ODM)和Sequelize(SQL的ORM)的查询语法!
错误原因
你写的这段查询代码是Mongoose的风格:
models.Page.find({}).sort({sorting:1}).exec(...)
但Sequelize的API逻辑完全不同:
- Sequelize中获取多条数据要用
findAll(而不是Mongoose的find) - Sequelize没有
sort()链式方法,排序需要通过order配置项实现 - 你之前用
findOne({ where: {...} })能正常工作,是因为那是Sequelize的正确语法,刚好和Mongoose的findOne参数格式有重叠,但列表查询的写法就完全不兼容了。
修正后的代码
把你的查询代码改成Sequelize的标准写法即可,这里提供两种常用风格:
1. Promise then/catch风格(和你原来的回调逻辑适配)
router.get('/', function(req, res){ models.Page.findAll({ // 按sorting字段升序排列,ASC是升序,DESC是降序 order: [['sorting', 'ASC']] }) .then(pages => { res.render('admin/pages', { pages: pages }); }) .catch(err => { console.error('获取页面列表失败:', err); // 可选:添加错误页面渲染或提示 res.status(500).send('加载页面列表出错'); }); });
2. Async/Await风格(更简洁易读)
如果你的路由支持async函数,可以这么写:
router.get('/', async function(req, res){ try { const pages = await models.Page.findAll({ order: [['sorting', 'ASC']] }); res.render('admin/pages', { pages: pages }); } catch (err) { console.error('获取页面列表失败:', err); res.status(500).send('加载页面列表出错'); } });
额外提示
Sequelize的查询配置项都需要放在findAll/findOne的参数对象里,比如过滤条件用where,排序用order,分页用limit和offset,和Mongoose的链式调用完全不同,以后写的时候要注意区分两种ORM的API差异哦~
内容的提问来源于stack exchange,提问作者Asad Iftikhar
相关产品推荐
相关产品推荐

