记录一下node开发中和mongodb 中的一些坑

类型问题

  1. 弱类型引发的问题 (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 方法却运行正常。同样的参数为什么就不一样了呢?

经过一番调试,我发现我们收到的 limitoffset 参数为 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");
}

// ...

此处评论已关闭