node.js - Mongoose/NodeJS - .EJS 模板中的排序按钮
问题描述
在我的 Mongoose 控制器中,我根据产品的创建日期进行排序:
let products = await Product.find().sort({ 'createdAt': -1 });
我想在 EJS 模板中创建一个按钮,允许用户选择不同的标准进行排序(例如价格)。创建按钮本身没有问题,但我不知道如何在选择选项时访问控制器中的排序功能(例如,如果选择了价格,则按价格排序),以及我应该将代码放在哪里控制器还是在 EJS 模板中?
我想我应该使用req.query
,但我不知道如何。谢谢。
解决方案
第 1 部分 - 将 Mongoose API 抽象为 JS
Mongoose 允许您构建您query
的部分。假设您有一个Product
带有附加选项对象的查询功能。
findOptions - 包含过滤器选项(where
查询的一部分)
pagingOptions - 包含排序+排序,页面和页面大小。
这是构建查询所需的所有上下文。
async function getProducts(findOptions, pagingOptions) {
const query = Product.find(findOptions);
if(pagingOptions.sort) {
// Note: This example assumes that paging.sort has the same structure as Monguse sort object.
query.sort(paging.sort);
}
let products = await query.exec();
...
return products;
}
用法:
let products = await getProducts({}, { 'createdAt': -1 });
let products = await getProducts({ 'createdAt': { $gt: Date.now() }}, { '_id': 1 });
您可以使用选项对象添加或限制许多东西来管理查询上下文请参阅:mongoose query doc
第二部分 - 公开 API
现在我们在服务器端有一个方法可以查询Products
仅使用的 JS 对象 ( JSON
),您将需要公开一个 HTTP API,以便客户端能够使用他的查询条件调用服务器。
让我们定义这是我们将发送给客户端以与之集成的 HTTP API:
发布/产品
// 请求正文
{
sort: { FIELD_NAME: ASC|DESC }, // ASC=1, DESC=-1
}
用法:
curl -X POST -H "Content-Type: application/json" --data '{ sort: { "createdAt": "1" } }' http:localhost:3000
注意:您可以扩展 HTTP API 和后端方法选项以进一步扩展功能。
请参阅以下内容以检查如何通过 express https://expressjs.com/en/guide/routing.html http://expressjs.com/en/resources/middleware/body-parser.html#bodyparserjsonoptions实现 HTTP 端点
第三部分 - 前端集成
现在剩下的就是实现一个 HTTP 客户端并公开 HTTP API,以便前端模块的其余部分能够调用后端。
以下是一个简单的fetch
示例,但您可以使用任何您喜欢的 HTTP 客户端库。
const productsEndpoint = baseUrl + '/products';
async function getProducts(options) {
const response = await fetch(productsEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(options)
});
return response.json();
}
这三个步骤将使您拥有跨组件和其中层的定义良好的 API。
推荐阅读
- .net - 如何通过 .net mongoDb 驱动程序通过嵌套属性获取 mongoDb 中的文档
- sql - 为每条记录选择最高值
- java - IntelliJ 中的“java:找不到符号”但 gradle 构建
- c++ - 为什么我不能将 int 分配给结构成员的联合成员?
- twilio - 如何将暂停添加到 Twilio studio Say/Play 小部件
- reactjs - PWA 显示独立不工作
- php - PHPMyAdmin 脚本超时,Wampserver64
- powershell - 批处理 - 根据文件夹创建日期查找和移动文件夹
- javascript - 在上传到载波轨道之前裁剪图像
- python - 用于卫星图像中目标检测的建议 CNN 框架?