Jon Newton

March 4, 2021

Handling invalid MongoDB IDs

I’m using Model.findById a lot when updating locations and their reviews in MongoDB. The +Getting MEAN+ book covers the 3 scenarios you’ll encounter in your callback:

  db.Location.findById(id).select('_id name').exec( (error, location) => {
    if (error) {
      console.log(`got error: ${error}`);
      //return 404
    }
    else {
      if (location) {
        console.log(`found it: ${location}`);
        //return 200
      }
      else {
        console.log(`not found: ${location}`); //will be null
        //return 404
      }
    }
  });


Reading and some experimenting showed that ‘error’ will be set if the id given is invalid, meaning it’s not the expected format for a Mongo Record id. I imagine there can be other causes of an error though, so I’m currently using isValidObjectId function to confirm the id is the correct shape before sending to a query.

This allows for a clear understanding of why a record was not found:
  • bad id data was provided
  • valid but non-matching id was provided
  • some other internal error

Updated example code:

  db.Location.findById(id).select('_id name').exec( (error, location) => {
    const valid = mongoose.isValidObjectId(id);

    if (!valid) {
      console.log(`invalid id: ${id}`);
      //consider this bad input, record not found.
      //return 404
    }

    if (error) {
      console.log(`got error: ${error}`);
      //something really bad happened
      //return 500
    }
    else {
      if (location) {
        console.log(`found it: ${location}`);
        //return 200
      }
      else {
        console.log(`not found: ${location}`); //will be null
        //valid id format but did not match a location
        //return 404
      }
    }
  });

Here is a full working example that illustrates several inputs and outputs.

About Jon Newton

Pandemic programming and beyond! My Link Tree