POST请求分页、排序结果

POST request for paginating, sorting results

我目前正在执行一个 GET 请求,该请求使用我编写的一系列方法来查询数据库并显示它们。这很好用,但我想让它成为一个 POST 请求方法,这样这些方法就不必依赖于 req.query,处理一个 json 主体而不是 [=] 的字符串24=] 参数,这将有助于 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:

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;

如果您需要将其转换为 POST 和 json 正文,那么您将使用类似下面的内容

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 解析器的两行也需要在你初始化 express server

的文件中

当使用异步 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 请求模板,可以轻松调整以满足个人需求。

这对我有用:

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;
    }