JsStudent
JsStudent

Reputation: 109

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

Upvotes: 7

Views: 19661

Answers (9)

Code Decor
Code Decor

Reputation: 31

You just need to add await before the find() function.

Upvotes: 3

heisenberg
heisenberg

Reputation: 13

tour.find will be executed asynchronously so we should handle the requests by then and catch.

Upvotes: 0

starterProgrammer
starterProgrammer

Reputation: 302

For me I missing await in the async function

// Delete Data 
 app.delete('/todos/delete/:id', async (req, res) => {
    const result =Todo.findByIdAndDelete(req.params.id)
    res.json(result)
 })

Fixed By Add await then it worked fine

// Delete Data 
app.delete('/todos/delete/:id', async (req, res) => {
   const result = await Todo.findByIdAndDelete(req.params.id)
   res.json(result)
})

Upvotes: 0

Sohaib ahmad
Sohaib ahmad

Reputation: 41

I missing await in the async function by adding await this finding the search id

Upvotes: 1

Shaxboz
Shaxboz

Reputation: 19

You may miss "await" keyword.

Upvotes: -1

Sam J
Sam J

Reputation: 1

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.

Upvotes: 0

Gursidak Singh
Gursidak Singh

Reputation: 41

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/

Upvotes: 4

duncanlarge
duncanlarge

Reputation: 306

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

Upvotes: 29

Anatoly
Anatoly

Reputation: 22803

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

Upvotes: 2

Related Questions