node.js - 在 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);
}
});
解决方案
我想出了一个不错的解决方案:我创建了一个 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);
}
});
推荐阅读
- xamarin.forms - 从 Xamarin.forms.ImageSource 到 UIKit.ImageView 的转换
- vlcj - vlcj 在流式传输时冻结在本地
- sed - 删除破折号 (-) 和第一个点 (.) 之间的字符串
- angular - 通过按钮更改离子警报 CssClass
- c# - 使用 C# 从 Json 中提取完整数据
- google-identity - Google YOLO 停止工作:不允许客户端源使用此 API
- javascript - textContent 和 innerHTML 不会改变 DOM
- c# - .Net Blazor 优于 Angular、React 或其他 JavaScript 框架
- css - CSS:为什么绝对div内的图像底部有一个小间隙?
- excel - “应用程序”对象是否有更多方法?