将循环结构转换为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
本身。
我正在学习后端 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
.
data
您应该等待 features.query
,而不是 features
本身。