记录一下node开发中和mongodb 中的一些坑
类型问题
- 弱类型引发的问题 (ts)
//先写两个功能差不多的方法
public static async getList( limit: number, offset: number ) {
const condition = {
// ...
};
return db.find(condition)
.skip(offset)
.limit(limit);
}
public static async getList2( limit: number, offset: number ) {
const aggregations = [
// ...
{ $skip: offset },
{ $limit: limit }
];
return db.aggregate(aggregations);
}
// 这里我们使用的后台框架是koa
public static async list(ctx: IRouterContext) {
const { limit = 20, offset = 0 } = ctx.request.query;
const res = await getList(limit,offset);
const res1 = await getList2(limit,offset);
// ...
ctx.body = {
res,res1
}
};
到这里可能有小伙伴也觉得没有什么问题,但是坑就是在不经意间到来
首先就是我们的 getList2
方法始终报错,limit需要number型。但是同时 getLit
方法却运行正常。同样的参数为什么就不一样了呢?
经过一番调试,我发现我们收到的 limit
和 offset
参数为 string
型,koa 在处理参数接收时声明为any类型,编译成js 后默认推导为string
类型,而在mongo中 使用 aggregate
方式不会自动转换数据类型,所以对应的类型一定要自己检测并转换好。
//最后的修改方案
// ...
let { limit = 20, offset = 0 } = ctx.request.query;
limit = Number.parseInt(limit.toString(), 10);
offset = Number.parseInt(offset.toString(), 10);
if (!Number.isInteger(limit) || !Number.isInteger(offset)) {
return ctx.throw(400, "limit offset must be integer");
}
// ...
最后更新于 2020-01-05 22:24:34 并被添加「」标签,已有 83 位童鞋阅读过。
此处评论已关闭