使用Knex查询posts表行数时报integer类型输入无效错误如何解决
问题原因
该报错和你写的getPostCount统计逻辑无关,是Express路由匹配顺序错误导致的:
你在当前/count路由的定义之前,大概率写了一个同层级带动态参数的路由,例如router.get('/:id', 业务逻辑)。Express会按照路由定义的先后顺序做路径匹配,当你请求/count时,会优先命中前面的/:id路由,将字符串count当做id参数的值传入后续逻辑,程序尝试用字符串count查询整数类型的id字段,就触发了类型转换错误。你看到的报错SQL是查询单条post的语句,而非count统计语句,也验证了请求根本没有走到你写的/count路由逻辑中。
解决方案
- 调整路由定义顺序:将路径固定的精确匹配路由(比如本次的
/count),放到所有同层级带动态参数的路由(比如/:id)前面,保证请求能匹配到正确的路由。 - 可以顺带优化冗余代码:你当前混写了
async/await和.then/.catch,写法冗余,同时Knex的count方法默认返回数组格式的结果,也可以优化成直接返回统计值:
优化后的统计函数:
async getPostCount() { // 给统计结果起别名,用first直接取第一条数据的统计值 const result = await db('posts').count('id as count').first(); return result.count; }
优化后的路由逻辑:
router.get( '/count', async (req, res, next) => { try { const count = await PostsService.getPostCount(); res.json({ count: count, token: req.query.secret_token }) } catch (err) { console.log(err); res .status(500) .json({ success: false, msg: `Something went wrong. ${err}` }); } } )
内容的提问来源于stack exchange,提问作者Sprawl63
相关产品推荐
相关产品推荐

