首页 > 解决方案 > 在 Mongoose (node.js, express RestAPI) 中添加分页和排序作为中间件

问题描述

有没有办法为所有请求添加限制、跳过和排序参数(如下所示),而不必为每个端点定义它们(有点像中间件)?我希望我的请求检查查询 URL 中的限制、跳过和 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);
  }
});

标签: node.jsexpressmongoose

解决方案


我想出了一个不错的解决方案:我创建了一个 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);
  }
});

推荐阅读