记一个mongoose类型转换的坑
解决办法直接看底部。
我的需求是:
分页查询,将page和size传入然后返回指定的结果。
我的代码是这么写的:
list(mpage,msize){
return new Promise((resolve, reject) => {
/*
.skip( 页码-1 * 每页显示的条数 ).limit(每页显示的条数)
*/
console.log(mpage)
console.log(msize)
LocationModel.find({}).skip( (page - 1) * size).limit(msize).exec( (error, result) => {
if (error){
resolve(false)
}else {
resolve(result)
}
})
})
}
发送请求测试,发现,每次指定的数量都是2,但是返回了全部。
然后就开始一顿 console.log() 。
首先判断,是不是没传size啊,打印一下,发现是传递了
又继续调试,是不是没这个值传递到service时丢失了啊?
发现也有值。
这就奇怪了,明明有值,为什么不生效?
于是百度 “mongoose limit 不生效”,什么也没查到。
这个时候,我就直接写死,在limit上直接写了个2,重新测试,发现正常了。
幡然醒悟
就是类型转换的问题,mongoose的 limit 只接收数值类型的参数,而我们从接口中传递的query参数,默认就是字符串类型的,
那么一路往下传递,最终传递过去的就是字符串类型。
mongoose:我虽然不接收字符串类型参数,但我就是不报错,诶,就是玩
......
为什么说是坑,因为js是若类型语言,日常使用过程中大都不会特别注意这个类型问题,数值型一般默认都是接收的,用 == 判断也是通过的,除非用来 === 来判断。
谁知道mongoose明明是js的东西,却有了一颗强类型语言的心
解决办法:
你可以使用parseInt 来转换,或者像我一样:
//直接 *1 就会将字符串转换为数值型了
LocationModel.find({}).skip( (mpage - 1) * msize).limit(msize*1).exec( (error, result) => {