简体   繁体   中英

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

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

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

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/

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.

You may miss "await" keyword.

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

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM