'Getting error "Converting circular structure to JSON" while working with express,mongodb
I'm trying to find tours within a specific distance.here is my code
exports.getTourWithin = catchAsync(async (req, res, next) => {
const { distance, latlng, unit } = req.params;
const [lat, lng] = latlng.split(',');
if (!lat || !lng) {
next(
new AppError(
`please provide latitude amd longitude in the form of lat,lng`,
400
)
);
}
const radius = unit === 'mi' ? distance / 3963.2 : distance / 6378.1;
const tours = Tour.find({
$geoWithin: { $centerSphere: [[lng, lat], radius] }
});
res.status(200).json({
status: 'success',
data: {
data: tours
}
});
});
but i'm getting this error in postman:
"message": "Converting circular structure to JSON\n --> starting at object with constructor 'NativeTopology'\n | property 's' -> object with constructor 'Object'\n | property 'sessionPool' -> object with constructor 'ServerSessionPool'\n --- property 'topology' closes the circle",
"stack": "TypeError: Converting circular structure to JSON\n --> starting at object with constructor 'NativeTopology'\n | property 's' -> object with constructor 'Object'\n | property 'sessionPool' -> object with constructor 'ServerSessionPool'\n --- property 'topology' closes the circle\n at JSON.stringify (<anonymous>)\n at stringify (D:\\Node-Jonas\\Node-Rest-Api\\node_modules\\express\\lib\\response.js:1119:12)\n at ServerResponse.json (D:\\Node-Jonas\\Node-Rest-Api\\node_modules\\express\\lib\\response.js:260:14)\n at D:\\Node-Jonas\\Node-Rest-Api\\controllers\\tourControllers.js:190:19\n at D:\\Node-Jonas\\Node-Rest-Api\\utilis\\catchAsync.js:3:5\n at Layer.handle [as handle_request] (D:\\Node-Jonas\\Node-Rest-Api\\node_modules\\express\\lib\\router\\layer.js:95:5)\n at next (D:\\Node-Jonas\\Node-Rest-Api\\node_modules\\express\\lib\\router\\route.js:137:13)\n at Route.dispatch (D:\\Node-Jonas\\Node-Rest-Api\\node_modules\\express\\lib\\router\\route.js:112:3)\n at Layer.handle [as handle_request] (D:\\Node-Jonas\\Node-Rest-Api\\node_modules\\express\\lib\\router\\layer.js:95:5)\n at D:\\Node-Jonas\\Node-Rest-Api\\node_modules\\express\\lib\\router\\index.js:281:22\n at param (D:\\Node-Jonas\\Node-Rest-Api\\node_modules\\express\\lib\\router\\index.js:354:14)\n at param (D:\\Node-Jonas\\Node-Rest-Api\\node_modules\\express\\lib\\router\\index.js:365:14)\n at param (D:\\Node-Jonas\\Node-Rest-Api\\node_modules\\express\\lib\\router\\index.js:365:14)\n at param (D:\\Node-Jonas\\Node-Rest-Api\\node_modules\\express\\lib\\router\\index.js:365:14)\n at Function.process_params (D:\\Node-Jonas\\Node-Rest-Api\\node_modules\\express\\lib\\router\\index.js:410:3)\n at next (D:\\Node-Jonas\\Node-Rest-Api\\node_modules\\express\\lib\\router\\index.js:275:10)"
}
how i can solve this issue?Thanks
Solution 1:[1]
I came across this exact error. You need to add "await" to your call to the Tours model as you're using async/await. You also need to include the field name you're querying on per @Anatoly's point:
const tours = await Tour.find({
yourfieldname: {
$geoWithin: { $centerSphere: [[lng, lat], radius] }
}
});
Solution 2:[2]
In tours
you got a cursor not the data themselves.
You should call toArray
to retrieve the data.
const tours = Tour.find({
$geoWithin: { $centerSphere: [[lng, lat], radius] }
});
res.status(200).json({
status: 'success',
data: {
data: tours.toArray()
}
});
Solution 3:[3]
In my case, I forget to put await in front of find() operation of mongo in a controller . It worked for me after adding await in that statement So it returned promise instead of desired results
for good understanding, read it once https://www.geeksforgeeks.org/mongodb-db-collection-find-method/
Solution 4:[4]
Since you are using Async so you have to add await
in Find()
function. In my case, the same error was occurred and solved by await.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | duncanlarge |
Solution 2 | Anatoly |
Solution 3 | |
Solution 4 | Tyler2P |