在Mongoose中添加分页和排序作为中间件(node.js,express RestAPI)

在Mongoose中添加分页和排序作为中间件(node.js,express RestAPI),node.js,express,mongoose,Node.js,Express,Mongoose,是否有一种方法可以向所有请求添加限制、跳过和排序参数(如下所示),而不必为每个端点定义它们(有点像中间件)?我希望我的请求在查询URL中检查limit、skip和sortBy参数,并相应地添加适当的参数 // Fetch all movies: GET / router.get("/", async (req: Request, res: Response) => { try { const movies = await Movie.find().limit

是否有一种方法可以向所有请求添加限制、跳过和排序参数(如下所示),而不必为每个端点定义它们(有点像中间件)?我希望我的请求在查询URL中检查limit、skip和sortBy参数,并相应地添加适当的参数

// Fetch all movies: GET /
router.get("/", async (req: Request, res: Response) => {
  try {
    const movies = await Movie.find().limit(req.query.limit).skip(req.query.skip).sort({title: 1});
    res.json(movies);
  } catch (err) {
    res.json({ message: err });
    console.log(err);
  }
});

我想出了一个不错的解决方案:我创建了一个SearchOptions类,它接受了查询并保存了我想要的参数:

class SearchOptions {
    limit: number | null;
    skip: number | null;
    sort: object | null;

    constructor(query: any) {
        this.limit = query.limit ? parseInt(query.limit) : null;
        this.skip = (query.page && this.limit) ? (parseInt(query.page)-1) * this.limit : null;
        this.sort = {};

        if(query.sortBy) {
            const sortStr = query.sortBy.split(':');
            this.sort[sortStr[0]] = sortStr[1] === 'desc' ? -1 : 1
        } 
    }
}

export default SearchOptions;
然后,我只是在我的路线中创建了一个对象的新实例:

// Fetch all movies: GET /
router.get("/", async (req: Request, res: Response) => {
  try {
    const movies = await Movie.find({}, null, new SearchOptions(req.query));
    res.json(movies);
  } catch (err) {
    res.json({ message: err });
    console.log(err);
  }
});

您是否可以编写一个公共函数并将查询参数传递给它,然后根据传递给该函数的查询参数返回mongoosequery,并在任何地方重复使用该函数。这就解决了问题,谢谢!我想这就是我所做的(见我的解决方案)