首页 > 解决方案 > Mongoose/NodeJS - .EJS 模板中的排序按钮

问题描述

在我的 Mongoose 控制器中,我根据产品的创建日期进行排序:

let products = await Product.find().sort({ 'createdAt': -1 });

我想在 EJS 模板中创建一个按钮,允许用户选择不同的标准进行排序(例如价格)。创建按钮本身没有问题,但我不知道如何在选择选项时访问控制器中的排序功能(例如,如果选择了价格,则按价格排序),以及我应该将代码放在哪里控制器还是在 EJS 模板中?

我想我应该使用req.query,但我不知道如何。谢谢。

标签: node.jssortingmongooseejs

解决方案


第 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。


推荐阅读