【问题标题】:POST request for paginating, sorting resultsPOST请求分页、排序结果
【发布时间】:2021-06-08 22:18:21
【问题描述】:

我目前正在执行GET 请求,该请求使用我编写的一堆方法来查询数据库并显示它们。这很好用,但我想让它成为POST 请求方法,以便这些方法不必依赖于req.query,处理 json 正文而不是 URL 参数字符串,这将有助于 url 字符串不除了端点之外还有其他任何东西,并使其尽可能动态。知道怎么做吗?

这是我的控制器方法:

exports.getBooks = async (req, res, next) => {

    const bookList = new BookList(Book.find(), req.query)
        .filter()
        .sort()
        .paginate();

    const books = await bookList.query;
    
    res.status(200)
        .json({
            books,
        });
};

这是拥有所有方法的 BookList 类:

class BookList {
    constructor(query, queryString) {
        this.query = query;
        this.queryString = queryString;
    }

    filter() {
        const queryObj = { ...this.queryString };
        const excludedFields = ['page', 'sort', 'limit', 'fields'];
        excludedFields.forEach(el => delete queryObj[el]);

        let queryStr = JSON.stringify(queryObj);

        this.query = this.query.find(JSON.parse(queryStr));

        return this;
    }

    sort() {
        if (this.queryString.sort) {
            const sortBy = this.queryString.sort.split(',').join(' ');
            this.query = this.query.sort(sortBy);
        } else {
            this.query = this.query.sort('-createdAt');
        }

        return this;
    }

    paginate() {
        const page = Number(this.queryString.page) || 1;
        const limit = Number(this.queryString.limit) || 100;
        const skip = (page - 1) * limit;

        this.query = this.query.skip(skip).limit(limit);

        return this;
    }
}
module.exports = BookList;

【问题讨论】:

    标签: javascript node.js mongodb express http-method


    【解决方案1】:

    这对我有用:

    exports.getBooks = async (req, res, next) => {
        let bookBody = req.body
        const bookList = new BookList(Book.find(), req.query)
            .filter(bookBody, req)
            .sort()
            .paginate();
    
        const books = await bookList.query;
        
        res.status(200)
            .json({
                books,
            });
    };
    
    filter(bookBody, req) {
            const filterBooks = bookBody.filter
            const bookId = req.params.bookId
    
            let requiredFilter
            if (filterBooks) {
                requiredFilter = {bookStatus: filterBooks.bookStatus, bookId};
            } else {
                requiredFilter = { bookId}
            }
            this.query = this.query.find(requiredFilter)
    
            return this;
        }
    

    【讨论】:

      【解决方案2】:

      如果您需要将其转换为带有 json 正文的 POST,那么您将使用如下所示的内容

      var bodyParser = require('body-parser')
      
      // parse application/json
      app.use(bodyParser.json())
      
      
      exports.getBooks = async (req, res, next) => {
      
          const bookList = new BookList(Book.find(), req.body)
              .filter()
              .sort()
              .paginate();
      
          const allReports = await bookList.query;
          
          res.status(200)
              .json({
                  books,
              });
      };
      

      在此我假设参数名称仍然相同。 json解析器的两行也需要在你初始化快速服务器的文件中

      【讨论】:

      • 我没有尝试将数据转换为 JSON,而是尝试使用 json 正文与使用来自 url 的 req.query 对象
      • 我还是没明白你想要什么?
      • @TarunLalwani 也许你添加了一个示例 ajax 发布请求......哈哈......
      【解决方案3】:

      当使用异步 javascript XML (AJAX) 请求从服务器发送和接收回数据时,可以指定“POST”或“GET”请求。可以通过单个此类请求发送或接收任意数量的项目,如下面的示例脚本所示。在您的情况下,您可以定制它以让脚本发送您的 JSON 数据。

      function AJAXroutine(val1,val2) { /* NAME IT WHATEVER YOU LIKE */
          var formAction=document.getElementById("MyForm").getAttribute('action');
      
          function Q(){
              var K=new XMLHttpRequest();
              var frm=new FormData();
      
              /* CAN HAVE ANY NUMBER OF VALUES SENT BACK TO SERVER */
              frm.append('V1',val1);
              frm.append('V2',val2);
              frm.append('V3',document.getElementById('another_elmt').value);
              frm.append('V4',document.getElementById('another_one').value);
      
              K.onreadystatechange=function(){
                  if(this.readyState==4&&this.status==200){
      
                      /* IF MULTIPLE VALUES ARE RETURNED */
                      var data=this.responseText.split("|");
                      document.getElementById('my_elmt').innerHTML=data[0];
                      document.getElementById('my_text').value=data[1];
                      /* ETC. */
      
                      /* IF JUST ONE VALUE IS RETURNED */
                      document.getElementById('my_elmt').value=this.responseText;
                  };
              };
              /* CAN OPTIONALLY CHANGE 'POST' TO 'GET' */
              K.open('post',formAction); 
              K.send(frm)
          }
          Q();
      }
      

      这是一个非常基本的 AJAX 请求模板,可以很容易地适应个人需求。

      【讨论】:

        猜你喜欢
        • 2011-01-17
        • 2019-03-02
        • 1970-01-01
        • 2020-12-30
        • 1970-01-01
        • 1970-01-01
        • 2011-12-18
        • 2011-03-05
        • 1970-01-01
        相关资源
        最近更新 更多