将循环结构转换为JSON,看不到任何循环

Converting circular structure to JSON, can't see anything circular

我正在学习后端 Web 开发,我正在学习的课程包括为具有“游览”的系统制作 REST API。我使用 MongoDB 和猫鼬,一切都很好,我根据参数过滤查询,一切顺利。但是后来导师想把这个过滤过程(和其他查询过程)放到一个class中,并在这个class中访问它们。完成此操作后,我开始收到此错误。所以我知道你不能将一个圆形对象转换为JSON,也不能将这样一个对象字符串化。但我没有任何……圆形物体。或者至少我不这么认为。我只是一个初学者,如果你愿意的话,请原谅我的错误。这是代码:

const Tour = require("../models/tourModel"); //MongoDB Document Model

class QueryModifier {
    constructor(query, reqQuery) {
        this.query = query;
        this.reqQuery = reqQuery;
    }

    filter() {
        console.log(this.reqQuery);
        const queryObj = { ...this.reqQuery }; //destruct the URL query object into a new object for a hard-copy
        const toBeExcluded = ["page", "sort", "limit", "fields"];

        toBeExcluded.forEach((el) => {
            delete queryObj[el];
        });

        console.log(queryObj);
        let queryStr = JSON.stringify(queryObj);
        queryStr = queryStr.replace(
            /\b(gte|gt|lte|lt)\b/g,
            (matchedStr) => `$${matchedStr}`
        );

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

    sort() {
        if (this.reqQuery.sort) {
            const sortBy = this.reqQuery.sort.replace(/(,)/g, " ");
            this.query = this.query.sort(sortBy);
        } else {
            this.query = this.query.sort("-createdAt");
        }
        return this;
    }

    limitFields() {
        if (this.reqQuery.fields) {
            const fields = this.reqQuery.fields.replace(/(,)/g, " ");
            this.query = this.query.select(fields);
        } else {
            //Default
            this.query = this.query.select("-__v"); //exclude __v
        }
        return this;
    }

    paginate() {
        const page = this.reqQuery.page * 1 || 1;
        const limit = this.reqQuery.limit * 1 || 10;
        const skip = (page - 1) * limit;
        this.query = this.query.skip(skip).limit(limit);

        return this;
    }
}

exports.getAllTours = async (req, res) => {
    try {
        const features = new QueryModifier(Tour.find(), req.query)
            .filter()
            .sort()
            .limitFields()
            .paginate();
        const tours = await features;

        res.status(200).json({ //<------ Error's "position" is after the second dot.
            status: "success",
            results: tours.length,
            data: { tours },
        });
    } catch (e) {
        res.status(404).json({
            status: "failure",
            message: e.message,
        });
        console.log(e);
    }
};

错误在我用箭头注释的地方。这是错误消息:

TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'Topology'
    |     property 's' -> object with constructor 'Object'
    |     property 'sessionPool' -> object with constructor 'ServerSessionPool'
    --- property 'topology' closes the circle
    at JSON.stringify (<anonymous>)
    at stringify (/Users/mirzabicer/Documents/GitHub/complete-node-bootcamp/4-natours/starter/node_modules/express/lib/response.js:1123:12)
    at ServerResponse.json (/Users/mirzabicer/Documents/GitHub/complete-node-bootcamp/4-natours/starter/node_modules/express/lib/response.js:260:14)
    at exports.getAllTours (/Users/mirzabicer/Documents/GitHub/complete-node-bootcamp/4-natours/starter/controllers/tourController.js:84:25)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)

我编辑了 JSON.stringify 呼叫:

let queryStr = '{ "sort": "price,ratingsAverage", "price": { "gte": "300" } }';

所以现在我的代码中几乎没有 JSON.stringify 调用。但是我得到的错误是完全一样的。

错误表明问题出在第 84 行的 tourController.js 中。我猜你是在调用 JSON.stringify 上那条线上的循环。尝试删除那个 JSON.stringify 调用。

看来 tours 很可能是问题所在。我看到它是一个QueryModifier。我想这可能不是您想要从 getAllTours.

return 得到的 data

您应该等待 features.query,而不是 features 本身。