Search

How to Handle Errors in JavaScript

Handling errors or exceptions is an integral part of software application development. Errors or exceptions can cause the program to work in an unexpected manner, resulting in security issues or inconvenience to the user. For this reason, it is very critical to handle errors appropriately.  Let’s consider a simple software program like a calculator performing division of two numbers. The software provides an input screen for users to enter the data on which the operation is required to be performed. Now, what if the user types in an invalid input, like say text instead of numbers or tries to perform division by zero. What happens if an error occurs?  Any software is designed to perform orderly transitions between different states. Now because of errors, we might end up being in a state which is not considered or envisaged during software development. This situation is known as unpredictable state of the software and can lead to serious vulnerabilities such as loss of data, buffer overflows etc.  Error handling, also called as exception handling, will help us prevent this unpredictable state by providing explicit instructions on handling unpredictable states. For example, if the user enters string data instead of numeric data for performing division operation, we can validate the data by transitioning to validation state for checking conditions that might create an error. If there is no error, software would continue to execute, otherwise it would enter a state where it would display the error message. Like most programming languages, JavaScript also has exception handling statements i.e. throw statement and try...catch statement. A note on exception Types: JavaScript provides predefined exceptions for specific purposes and it is suggested to use one of them for effectiveness. That said, any object can be thrown in JavaScript and the most common practice is to throw numbers or strings as errors.  throw statement is used to throw an exception with a specified value to be thrown. A few examples are as follows: throw 'new error';  // String type  throw 54;           // Number type  throw false;        // Boolean type  throw { errorcode: 500, message: 'internal server error' } // Object type try…catch statement consists of a try block which contains multiple statements and a catch block containing the statements to be executed if an exception happens in try block during execution of statements in that block. In a positive flow, all the statements in try block succeed and control will skip the catch block. Otherwise, if there is an exception thrown in the try block, the following lines in try block are skipped and the control shifts to catch. In either case, finally block executes after try and catch blocks are executed. function getIPLTeamCaptain(team){    let teams = new Map();    teams.set('CSK', 'Dhoni');    teams.set('RCB', 'Kohli');    teams.set('SRH', 'Warner');    teams.set('MI', 'Rohit');    teams.set('KXI', 'Rahul');    teams.set('DC', 'Pant');    teams.set('KKR', 'Morgan');    teams.set('RR', 'Sanju');    if (teams.has(team) === true) {      return teams.get(team);    } else {      throw 'InvalidTeam';    }  }  try {    const captain = getIPLTeamCaptain('Pune');    console.log(captain);  } catch (error) {    console.error(error);  } In catch block, we have an identifier that holds the value specified by the throw statement. This can be used to get the information about the exception details. The scope of this identifier lasts within catch block and post finishing the execution, the identifier no longer exists. Note on best practices: When logging errors to the console inside a catch block, it is advisable to use console.error() rather than console.log() for debugging. It formats the message as an error, and adds it to the list of error messages generated by the page. Few pitfalls or best practices to be known while considering finally block If there is an I/O operation in try block which results in an exception, then it is better to handle the clean-up code in finally block. For example, a DB connection is made or a file is opened and during processing of the file an exception has occurred. Though the catch will handle the exception, clean up code has to be handled in finally block i.e. closing of file. The finally block will execute regardless of whether an exception has been raised or not.  If a finally block returns a value, then regardless of whether an exception is raised or a value is returned in the try and catch block, the finally block return value will overwrite those values. function raiseException() {    try {      throw 500;    } catch(e) {      console.error(e);      throw e; // this throw statement is suspended until finally block has completed    } finally {      return false; // overwrites the previous "throw"    }    // always returns false  }  try {    raiseException();  } catch(e) {    // this is never reached!    // while raiseException() executes, the `finally` block returns false, which overwrites the `throw` inside the above `catch`    console.error(e);  } Nesting of try..catch statements is possible; but if inner try block does not have corresponding catch block then it should have a finally block. The enclosing try…catch statement’s catch block is checked for a match. Error objects are a specific type of core objects which are thrown during runtime. To log more refined messages about error, we can use ‘name’ and ‘message’ properties. Refer to this link to know more about Error objectFor example, throw new Error(‘Error Message’); when caught in catch block, the identifier will have the property name as ‘Error’ and property message as ‘Error Message’. When a runtime error occurs, error objects are created and thrown. Any user-defined exceptions can be built extending the Error. Below are some of the predefined error constructors extended from generic Error constructor.  AggregateError  EvalError  RangeError  ReferenceError  SyntaxError  TypeError  URIError  Let’s understand each one with an example. 1. AggregateError as the name suggests is used to wrap multiple errors into a single error. Imagine we are processing multiple async calls via promises and used Promise.any(). This would raise AggregateError or we can create our own new AggregateError as shown below. Promise.any([    Promise.reject(new Error("some error")),  ]).catch(e => {    console.log(e instanceof AggregateError); // true    console.log(e.message);                   // "All Promises rejected"    console.log(e.name);                      // "AggregateError"    console.log(e.errors);                    // [ Error: "some error" ]  }); OR try {    throw new AggregateError(['Error', 500, new Error('message')],'AggregateErrorMessage');  } catch (e) {    console.log(e instanceof AggregateError); // true    console.log(e.message);                   // "AggregateErrorMessage"    console.log(e.name);                      // "AggregateError"   console.log(e.errors.length)              // 3  } 2. EvalError occurs when using global eval() function. This exception is no more thrown by JavaScript. 3. RangeError is to be thrown when a value is not in the range of allowed values. Like passing bad values to numeric methods like toFixed, toPrecision etc. try {    var num = 10.123.toFixed(-1);  } catch (e) {    console.error(e instanceof RangeError); // true    console.error(e.message);               // argument must be between 0-100    console.error(e.name);                  // RangeError  } 4. ReferenceError is raised when a non-existent variable is referenced. try {    let a = undefinedVar  } catch (e) {    console.log(e instanceof ReferenceError)  // true    console.log(e.message)                    // "undefinedVar is not defined"    console.log(e.name)                       // "ReferenceError"  } 5. SyntaxError is thrown by the JavaScript engine if it encounters tokens which do not conform to the syntax of the language while parsing the code. try {    eval('hoo bar');  } catch (e) {    console.error(e instanceof SyntaxError); // true    console.error(e.message);                // Unexpected identifier    console.error(e.name);                   // SyntaxError  } 6. TypeError is raised if an operation is performed on a value which is not expected on its type. Say if we are attempting to modify a value that cannot be changed. try {    const a = "constant";    a = 'change';  } catch (e) {    console.log(e instanceof TypeError)  // true    console.log(e.message)               // "Assignment to constant variable."    console.log(e.name)                  // "TypeError"  } 7. URIError is raised when global URL handling function is used in an inappropriate way. try {    decodeURIComponent('%')  } catch (e) {    console.log(e instanceof URIError)  // true    console.log(e.message)              // URI malformed    console.log(e.name)                 // "URIError  }  Handling Specific errorIf we want to handle different error types differently then we can check for error instanceof and handle them accordingly. try {    customMethod();  } catch (e) {    if (e instanceof EvalError) {      console.error(e.name + ': ' + e.message)    } else if (e instanceof RangeError) {      console.error(e.name + ': ' + e.message)    } else if (e instanceof URIError) {      console.error(e.name + ': ' + e.message)    } else if (e instanceof TypeError) {      console.error(e.name + ': ' + e.message)    } else if (e instanceof AggregateError) {      console.error(e.name + ': ' + e.message)    } else if(typeof e === 'string' || e instanceof String) {      console.error(`Error of type string with message ${e}`);    } else if(typeof e === 'number' || e instanceof Number) {      console.error(`Error of type number with message ${e}`);    } else if(typeof e === 'boolean' || e instanceof Boolean) {      console.error(`Error of type boolean with message ${e}`);    } else {      // if we aren't sure of other types of errors,      // probably it is best to rethrow      throw e;    }  } Note: In real time applications, we would handle specific error types based on the functionality in the try block and wouldn’t have so many different error types for a single try...catch block. Also having multiple errors and having multiple if … else statements is not recommended as per the single responsibility principle. Please refer to the above code only for reference to identify the specific error type. Custom Error TypeSometimes we would like customize the error or want to have our own error types. To create custom Error types, we have to extend the existing Error object and throw the custom error accordingly. We can capture our custom error type using instanceof. This is a cleaner and more consistent way of error handling. class MyError extends Error {    constructor(customProperty, ...params) {      // Pass arguments to parent constructor      super(...params);      // Maintains proper stack trace for where our error was thrown(available on V8)      if (Error.captureStackTrace) {        Error.captureStackTrace(this, MyError);      }      this.name = 'MyError';      // Custom debugging information      this.customProperty = customProperty;      this.date = new Date();    }  }  try {    throw new MyError('custom', 'message')  } catch(e) {    console.error(e.name)           // MyError    console.error(e.customProperty) // custom    console.error(e.message)        // message    console.error(e.stack)          // MyError: message with stacktrace  } DOMException TypeThe DOMException occurs as a result of calling a method or accessing a property of a web API which represents an abnormal event that occurred. Refer to this link to know more about DOMException Promise Error PropagationA Promise is an object representing the eventual completion or failure of an asynchronous operation. Promises allow to chain multiple asynchronous operations back-to-back in a sequence order. When we chain multiple asynchronous operations, then we can have catch at the end of the chain to capture any exception or rejection that happened at any promise. Catch takes a callback function and the callback is set to execute when the Promise is rejected. For example: Promise.resolve(doSomething)  .then(action1 => Action1(action1))  .then(action2 => Action2(action2))  .catch(failureCallback);  // Attaches a callback for only the rejection of the Promise.  // @returns — A Promise for the completion of the callback. As per the above example, we are performing multiple async actions but we have a single catch block to capture any rejection. Let’s understand this with an assumption that the calls are synchronous in nature. try {    const action1 = doSomething();    const action2 = Action1(action1);    const finalResult = Action2(action2);    console.log(`Got the final result: ${finalResult}`);  } catch(error) {    failureCallback(error);  } If there’s an exception, then the browser will jump over to catch block and execute the failureCallback. Based on ECMAScript 2017 async/await syntactic sugar-coated way, we can change the synchronous code to asynchronous. async function SampleAsync() {    try {      const action1 = await doSomething();      const action2 = await Action1(action1);      const finalResult = await Action2(action2);      console.log(`Got the final result: ${finalResult}`);    } catch(error) {      failureCallback(error);    }  }  Promises help to resolve the callback hell by catching all errors i.e. thrown exceptions or programming errors. This is important for functional composition of async operations. What would happen if there isn’t a catch for a promise? Promises are associated with two events i.e. rejectionhandled and unhandledrejection. Whenever a promise is rejected, one of these two events is sent to the global scope which might be a window or a worker. rejectionhandled - sent when a promise is rejected, and post rejection the executor’s reject is handled. unhandledrejection – promise is rejected but there is no rejection handler available. Note: Both events are of type PromiseRejectionEvent which has details of the actual promise which was rejected and a reason property depicting the reason for rejection. Since both the events are in global scope, all errors will go to the same event handlers regardless of the source. This makes it easy to offer a fallback error handling mechanism for promises. While working with Node.js on the server side, we might include some common modules and there is a high possibility that we may have some unhandled rejected promises which get logged to the console by the Node.js runtime. If we want to capture those and process or log them outside the console, then we can add these handlers on the process as shown below. process.on("unhandledRejection", (reason, promise) => {    // You might start here by adding code to examine the "promise" and "reason" values.  });  The impact of adding this handler on the process is that it will prevent the errors from being logged to the console by the node.js runtime. There is no need for calling preventDefault() method available on browser runtimes.  Note: Adding the listener on the process.on and not coding to capture the promise and reasons would result in loss of the error. So it is suggested to add code to examine the rejected promise to identify the cause of rejection. Window UnhandledRejection EventThe global scope being window (may also be worker), it is required to call the event.preventDefault() in the unhandledrejection to cancel the event. This prevents it from bubbling up to be handled by the runtime’s logging code. It works because unhandledrejection is cancellable. window.addEventListener('unhandledrejection', function (event) {    // ...your code here to handle the unhandled rejection...    // Prevent the default handling (such as outputting the    // error to the console)    event.preventDefault();  }); To summarise a few points related to error handling: Try to handle errors specific to the type of error. Use Error object instead of numeric, string or Boolean while throwing an error. As Error object will capture the stack trace and error type, specific handling is possible. Release resources if any in finally block. Being more specific with throw error helps in handling it cleanly instead of generic error. Avoid unwanted catch block if they are meant only for logging, and re-throw the error again. Otherwise, this will result in clogging of logs. Last but not least, suppression/swallow/shadowing of exception as shown below should be avoided. This might make the application continue to work but the underlining issue will not be fixed. try {    throw new Error('my error');  }  catch(e) {} // no one knows about this  try {    throw new Error('my error');  }  catch(e) {    console.log(err); // error is logged but application continues  }  try {    throw new Error('my error');  }  finally {    return null; // error is swallowed  }  try {    throw new Error('actual error');  }  finally {    throw new Error('new error'); // actual error is shadowed by new one  } Conclusion Error handling is one of the most important facets in software programming that has to be acknowledged and experienced by the developer. Software should be as predictable as possible in terms of state transitions. 

How to Handle Errors in JavaScript

9K
How to Handle Errors in JavaScript

Handling errors or exceptions is an integral part of software application development. Errors or exceptions can cause the program to work in an unexpected manner, resulting in security issues or inconvenience to the user. For this reason, it is very critical to handle errors appropriately.  

Let’s consider a simple software program like calculator performing division of two numbers. The software provides an input screen for users to enter the data on which the operation is required to be performed. Now, what if the user types in an invalid input, like say text instead of numbers or tries to perform division by zero. What happens if an error occurs?  

Any software is designed to perform orderly transitions between different states. Now because of errors, we might end up being in a state which is not considered or envisaged during software development. This situation is known as unpredictable state of the software and can lead to serious vulnerabilities such as loss of data, buffer overflows etc.  

Error handling, also called as exception handling, will help us prevent this unpredictable state by providing explicit instructions on handling unpredictable states. For example, if the user enters string data instead of numeric data for performing division operation, we can validate the data by transitioning to validation state for checking conditions that might create an error. If there is no error, software would continue to execute, otherwise it would enter a state where it would display the error message. 

Like most programming languages, JavaScript also has exception handling statements i.e. throw statement and try...catch statement. 

A note on exception Types: JavaScript provides predefined exceptions for specific purposes and it is suggested to use one of them for effectiveness. That said, any object can be thrown in JavaScript and the most common practice is to throw numbers or strings as errors.  

throw statement is used to throw an exception with a specified value to be thrown. A few examples are as follows: 

throw 'new error';  // String type 
throw 54;           // Number type 
throw false;        // Boolean type 
throw { errorcode: 500message: 'internal server error' } // Object type 

try…catch statement consists of a try block which contains multiple statements and a catch block containing the statements to be executed if an exception happens in try block during execution of statements in that block. 

In positive flow, all the statements in try block succeed and control will skip the catch block. Otherwise, if there is an exception thrown in the try block, the following lines in try block are skipped and the control shifts to catch. In either case, finally block executes after try and catch blocks are executed. 

function getIPLTeamCaptain(team){ 
  let teams = new Map(); 
  teams.set('CSK''Dhoni'); 
  teams.set('RCB''Kohli'); 
  teams.set('SRH''Warner'); 
  teams.set('MI''Rohit'); 
  teams.set('KXI''Rahul'); 
  teams.set('DC''Pant'); 
  teams.set('KKR''Morgan'); 
  teams.set('RR''Sanju'); 
  if (teams.has(team) === true) { 
    return teams.get(team); 
  } else { 
    throw 'InvalidTeam'; 
  } 
} 
try { 
  const captain = getIPLTeamCaptain('Pune'); 
  console.log(captain); 
catch (error) { 
  console.error(error); 
} 

In catch block, we have an identifier that holds the value specified by the throw statement. This can be used to get the information about the exception details. The scope of this identifier lasts within catch block and post finishing the execution, the identifier no longer exists. 

Note on best practices: When logging errors to the console inside a catch block, it is advisable to use console.error() rather than console.log() for debugging. It formats the message as an error, and adds it to the list of error messages generated by the page. 

Few pitfalls or best practices to be known while considering finally block 

  • If there is an I/O operation in try block which results in an exception, then it is better to handle the clean-up code in finally block. For example, a DB connection is made or a file is opened and during processing of the file an exception has occurred. Though the catch will handle the exception, clean up code has to be handled in finally block i.e. closing of file. 
  • The finally block will execute regardless of whether an exception has been raised or not.  If a finally block returns a value, then regardless of whether an exception is raised or a value is returned in the try and catch block, the finally block return value will overwrite those values. 
function raiseException() { 
  try { 
    throw 500; 
  } catch(e) { 
    console.error(e); 
    throw e// this throw statement is suspended until finally block has completed 
  } finally { 
    return false// overwrites the previous "throw" 
  } 
  // always returns false 
} 
try { 
  raiseException(); 
catch(e) { 
  // this is never reached! 
  // while raiseException() executes, the `finally` block returns false, which overwrites the `throw` inside the above `catch` 
  console.error(e); 
} 

Nesting of try..catch statements is possible; but if inner try block does not have corresponding catch block then it should have finally block. The enclosing try…catch statement’s catch block is checked for a match. 

Error objects are specific type of core objects which are thrown during runtime. To log more refined messages about error, we can use ‘name’ and ‘message’ properties. 

Refer to this link to know more about Error object

For example, throw new Error(‘Error Message’); when caught in catch block, the identifier will have the property name as ‘Error’ and property message as ‘Error Message’. 

When a runtime error occurs, error objects are created and thrown. Any user-defined exceptions can be built extending the Error. 

Below are some of the predefined error constructors extended from generic Error constructor.  

  • AggregateError  
  • EvalError  
  • RangeError  
  • ReferenceError  
  • SyntaxError  
  • TypeError  
  • URIError  

Let’s understand each one with an example. 

1. AggregateError as the name suggests is used to wrap multiple errors into a single error. Imagine we are processing multiple async calls via promises and used Promise.any(). This would raise AggregateError or we can create our own new AggregateError as shown below. 

Promise.any([ 
  Promise.reject(new Error("some error")), 
]).catch(e => { 
  console.log(e instanceof AggregateError); // true 
  console.log(e.message);                   // "All Promises rejected" 
  console.log(e.name);                      // "AggregateError" 
  console.log(e.errors);                    // [ Error: "some error" ] 
}); 

OR 

try { 
  throw new AggregateError(['Error'500new Error('message')],'AggregateErrorMessage'); 
catch (e) { 
  console.log(e instanceof AggregateError); // true 
  console.log(e.message);                   // "AggregateErrorMessage" 
  console.log(e.name);                      // "AggregateError" 
 console.log(e.errors.length)              // 3 
} 

2. EvalError occurs when using global eval() function. This exception is no more thrown by JavaScript. 

3. RangeError is to be thrown when a value is not in the range of allowed values. Like passing bad values to numeric methods like toFixedtoPrecision etc. 

try { 
  var num = 10.123.toFixed(-1); 
catch (e) { 
  console.error(e instanceof RangeError); // true 
  console.error(e.message);               // argument must be between 0-100 
  console.error(e.name);                  // RangeError 
} 

4. ReferenceError is raised when a non-existent variable is referenced. 

try { 
  let a = undefinedVar 
catch (e) { 
  console.log(e instanceof ReferenceError)  // true 
  console.log(e.message)                    // "undefinedVar is not defined" 
  console.log(e.name)                       // "ReferenceError" 
} 

5. SyntaxError is thrown by the JavaScript engine if it encounters tokens which do not conform to the syntax of the language while parsing the code. 

try { 
  eval('hoo bar'); 
catch (e) { 
  console.error(e instanceof SyntaxError); // true 
  console.error(e.message);                // Unexpected identifier 
  console.error(e.name);                   // SyntaxError 
} 

6. TypeError is raised if an operation is performed on a value which is not expected on its type. Say if we are attempting to modifa value that cannot be changed. 

try { 
  const a = "constant"; 
  a = 'change'; 
catch (e) { 
  console.log(e instanceof TypeError)  // true 
  console.log(e.message)               // "Assignment to constant variable." 
  console.log(e.name)                  // "TypeError" 
} 

7. URIError is raised when global URL handling function is used in an inappropriate way. 

try { 
  decodeURIComponent('%') 
catch (e) { 
  console.log(e instanceof URIError)  // true 
  console.log(e.message)              // URI malformed 
  console.log(e.name)                 // "URIError 
}  

Handling Specific error

If we want to handle different error types differently then we can check for error instanceof and handle them accordingly. 

try { 
  customMethod(); 
catch (e) { 
  if (e instanceof EvalError) { 
    console.error(e.name + ': ' + e.message) 
  } else if (e instanceof RangeError) { 
    console.error(e.name + ': ' + e.message) 
  } else if (e instanceof URIError) { 
    console.error(e.name + ': ' + e.message) 
  } else if (e instanceof TypeError) { 
    console.error(e.name + ': ' + e.message) 
  } else if (e instanceof AggregateError) { 
    console.error(e.name + ': ' + e.message) 
  } else if(typeof e === 'string' || e instanceof String) { 
    console.error(`Error of type string with message ${e}`); 
  } else if(typeof e === 'number' || e instanceof Number) { 
    console.error(`Error of type number with message ${e}`); 
  } else if(typeof e === 'boolean' || e instanceof Boolean) { 
    console.error(`Error of type boolean with message ${e}`); 
  } else { 
    // if we aren't sure of other types of errors, 
    // probably it is best to rethrow 
    throw e; 
  } 
} 

Note: In real time applications, we would handle specific error types based on the functionality in the try block and wouldn’t have so many different error types for a single try...catch block. Also having multiple errors and having multiple if … else statements is not recommended as per the single responsibility principle. 

Please refer to the above code only for reference to identify the specific error type. 

Custom Error Type

Sometimes we would like customize the error or want to have our own error types. To create custom Error types, we have to extend the existing Error object and throw the custom error accordingly. We can capture our custom error type using instanceof. This is cleaner and more consistent way of error handling. 

class MyError extends Error { 
  constructor(customProperty, ...params) { 
    // Pass arguments to parent constructor 
    super(...params); 
    // Maintains proper stack trace for where our error was thrown(available on V8) 
    if (Error.captureStackTrace) { 
      Error.captureStackTrace(thisMyError); 
    } 
    this.name = 'MyError'; 
    // Custom debugging information 
    this.customProperty = customProperty; 
    this.date = new Date(); 
  } 
} 
try { 
  throw new MyError('custom''message') 
catch(e) { 
  console.error(e.name)           // MyError 
  console.error(e.customProperty// custom 
  console.error(e.message)        // message 
  console.error(e.stack)          // MyError: message with stacktrace 
} 

DOMException Type

The DOMException occurs as a result of calling a method or accessing a property of a web API which represents an abnormal event that occurred. 

Refer to this link to know more about DOMException 

Promise Error Propagation

A Promise is an object representing the eventual completion or failure of an asynchronous operation. Promises allow to chain multiple asynchronous operations back-to-back in a sequence order. 

When we chain multiple asynchronous operations, then we can have catch at the end of the chain to capture any exception or rejection that happened at any promise. Catch takes a callback function and the callback is set to execute when the Promise is rejected. 

For example: 

Promise.resolve(doSomething) 
.then(action1 => Action1(action1)) 
.then(action2 => Action2(action2)) 
.catch(failureCallback); 
// Attaches a callback for only the rejection of the Promise. 
// @returns — A Promise for the completion of the callback. 

As per the above example, we are performing multiple async actions but we have a single catch block to capture any rejection. Let’s understand this with an assumption that the calls are synchronous in nature. 

try { 
  const action1 = doSomething(); 
  const action2 = Action1(action1); 
  const finalResult = Action2(action2); 
  console.log(`Got the final result: ${finalResult}`); 
catch(error) { 
  failureCallback(error); 
} 

If there’s an exception, then the browser will jump over to catch block and execute the failureCallback. 

Based on ECMAScript 2017 async/await syntactic sugar-coated way, we can change the synchronous code to asynchronous. 

async function SampleAsync() { 
  try { 
    const action1 = await doSomething(); 
    const action2 = await Action1(action1); 
    const finalResult = await Action2(action2); 
    console.log(`Got the final result: ${finalResult}`); 
  } catch(error) { 
    failureCallback(error); 
  } 
}  

Promises help to resolve the callback hell by catching all errors i.e. thrown exceptions or programming errors. This is important for functional composition of async operations. 

What would happen if there isn’t a catch for a promise?

 Promises are associated with two events i.e. rejectionhandled and unhandledrejection. Whenever a promise is rejected, one of these two events is sent to the global scope which might be a window or a worker. 

  • rejectionhandled - sent when a promise is rejected, and post rejection the executor’s reject is handled. 
  • unhandledrejection – promise is rejected but there is no rejection handler available. 

Note: Both events are of type PromiseRejectionEvent which has details of the actual promise which was rejected and a reason property depicting the reason for rejection. 

Since both the events are in global scope, all errors will go to the same event handlers regardless of the source. This makes it easy to offer a fallback error handling mechanism for promises. 

While working with Node.js on the server side, we might include some common modules and there is a high possibility that we may have some unhandled rejected promises which get logged to the console by the Node.js runtime. If we want to capture those and process or log them outside the console, then we can add these handlers on the process as shown below. 

process.on("unhandledRejection", (reasonpromise=> { 
  // You might start here by adding code to examine the "promise" and "reason" values. 
}); 

 The impact of adding this handler on the process is that it will prevent the errors from being logged to the console by the node.js runtime. There is no need for calling preventDefault() method available on browser runtimes. 

 Note: Adding the listener on the process.on and not coding to capture the promise and reasons would result in loss of the error. So it is suggested to add code to examine the rejected promise to identify the cause of rejection. 

Window UnhandledRejection Event

The global scope being window (may also be worker), it is required to call the event.preventDefault() in the unhandledrejection to cancel the event. This prevents it from bubbling up to be handled by the runtime’s logging code. It works because unhandledrejection is cancellable. 

window.addEventListener('unhandledrejection'function (event) { 
  // ...your code here to handle the unhandled rejection... 
  // Prevent the default handling (such as outputting the 
  // error to the console) 
  event.preventDefault(); 
}); 

To summarise a few points related to error handling: 

  • Try to handle errors specific to the type of error. 
  • Use Error object instead of numeric, string or Boolean while throwing an error. As Error object will capture the stack trace and error type, specific handling is possible. 
  • Release resources if any in finally block. 
  • Being more specific with throw error helps in handling it cleanly instead of generic error. 
  • Avoid unwanted catch block if they are meant only for logging, and re-throw the error again. Otherwise, this will result in clogging of logs. 
  • Last but not least, suppression/swallow/shadowing of exception as shown below should be avoided. This might make the application continue to work but the underlining issue will not be fixed. 
try { 
  throw new Error('my error'); 
} 
catch(e) {} // no one knows about this 
try { 
  throw new Error('my error'); 
} 
catch(e) { 
  console.log(err); // error is logged but application continues 
} 
try { 
  throw new Error('my error'); 
} 
finally { 
  return null// error is swallowed 
} 
try { 
  throw new Error('actual error'); 
} 
finally { 
  throw new Error('new error'); // actual error is shadowed by new one 
} 

Conclusion 

Error handling is one of the most important facets in software programming that has to be acknowledged and experienced by the developer. Software should be as predictable as possible in terms of state transitions. 

Sumanth

Sumanth Reddy

Author

Full stack,UI Architect having 14+ Years of experience in web, desktop and mobile application development with strong Javascript/.Net programming skills .Strong experience in microsoft tech stack and Certified in OCI associate. Go-to-guy on integration of applications, building a mobile app by zeroing on tech stack. Majorily experienced on engineering based IIOT products and Marekting Automation products deployed on premise and on-cloud. 

Join the Discussion

Your email address will not be published. Required fields are marked *

Suggested Blogs

Handling React Events - A Detailed Guide

Event handling essentially allows the user to interact with a webpage and do something specific when a certain event like a click or a hover happens. When the user interacts with the application, events are fired, for example, mouseover, key press, change event, and so on. The application must handle events and execute the code. In short, events are the actions to which javascript can respond.   The actions to which javascript can respond are called events. Handling events with react is  very similar to handling events in DOM elements. Below are some general events that you would see in and out when dealing with react based websites:  Clicking an element  Submitting a form Scrolling page Hovering an element  Loading a webpage Input field change User stroking a key Image loading Naming Events in React Handling events with react is very similar to handling events in DOM elements, although there are some syntactic differences.   React events are written in camelCase.   A function is passed as the event handler rather than string. The way to write events in html / DOM is below:        click me onclick is written in lower case in html as shown above and what action to take when this onclick event triggers is taken care of by handleClick.In React, events are named using camel case and you pass a function as event handler as shown below:  Like in a functional component, event is written like below:       click me   In class based component ,event is written like below        click me Defining Events:Events are normally used in combination with functions, and the function is not executed until the event occurs, and the combination of event, HTML element, and javascript function is called binding which means to map all three. Generic syntax is:      Example:  Create a button element and what happens when onClick event triggered is driven by the function which is func() shown below     click me Let’s see some of the event attributes:   onmouseover : The mouse is moved over an element onmouseup : The mouse button is released onmouseout : The mouse  is moved off an element onmousemove: The mouse is moved Onmousedown: mouse button is pressed  onload : A image is done loading onunload: Existing the page  onblur : Losing Focus  on element  onchange : Content of a field changes onclick: Clicking an object  ondblclick: double clicking an object  onfocus element getting a focus  Onkeydown: pushing a keyboard key Onkeyup: keyboard key is released Onkeypress: keyboard key is pressed  Onselect: text is selected These are some examples of events:                                         Events                               function testApp (){                        alert((“Hello Event”);                                                   test Clicked                  test double Clicked                     Synthetic Events When you specify an event in JSX, you are not directly dealing with regular DOM events, you are dealing with a react event type called a synthetic event.It's a simple wrapper for native event instances and every synthetic event created needs to be garbage-collected which can be resource intensive in terms of CPU. The synthetic event object has properties mentioned below:  Boolean isTrusted  DOMEvent nativeEvent number timeStamp   void preventDefault() number eventPhase Synthetic events provide an interface and reduce browser inconsistencies and the event contains required information for its propagation to work. Synthetic event is reused for performance reasons in the browser, A synthetic event is a cross-browser wrapper around the browser’s native event it has the same interface as the native event. Synthetic events are delegated to the document node. Therefore native events are triggered first and the events bubble up to document, after which the synthetic events are triggered. The synthetic event object will be reused and all the properties will be nullified after the event callback has been invoked and this is for performance reasons.The workflow of synthetic event in react is:    Element ---- > Event ---- > synthetic event  ---- > handler(e)                                |                                                      |                                |  _______  Component ________|  umber timeStamp The Basics of React Event Handling Let’s explore how to handle events in react and we will showcase the click event and how it holds good for other types of events. Let’s start with functional components by creating a  file as clickAppHandler.js.In this file let’s create a  functional component  as shown below                        Import React from ‘...react’                         function clickAppHandler() {                                function clickHandler() {                                        console.log(‘clicked’)                                         }                                  return (                                                                                  Click                                                                          )                         }                       export default clickAppHandler  When onClick event triggers clickHandler function is called as shown below and when you click the button console will print the string “clicked” After this you need the add a component in the app component. In our code above you can see on click we pass the function as event handler and you will notice that we haven't added parentheses as it becomes a function, and we do not want that and we want handler to be a function not a function call. When a new component is rendered its event handler functions are added to the mapping maintained by the react.When the event is triggered and it hits and DOM object ,react maps the event to the handler, if it matches it calls the handler. The event handling in react is declarative and the advantage of declarative way to handlers is that they are part of the User interface structure.  Let’s take a look at event handling in class components                       Import React, { Component } from ‘...react’                         class TestApp extends Component {                              clickHandler() {                                  console.log(“clicked”)                                }                                render(){                                      return(                                                                                     Click me                                                                                 )                                 }                            }                       export default TestApp You cannot return false to prevent default behaviour in React. You must call preventDefault explicitly.  In HTML it looks like below:    Click Output: It will print “Clicked”  And in React, like this:  function clickHandle(e) {       e.preventDefault();       console.log(“Handled”);   }  Click  Output : console will print “Handled”  There are some  event handlers triggered by an event in the bubbling phase which is the same as with the normal DOM API; simply attach a handler to an eventual parent of an element and any events triggered on that element will bubble to the parent as long as it's not stopped via stopPropagation along the way   Click me  Below are some of the event handlers triggered in the bubbling phase:  MouseEvents           onClick           onDrag          onDoubleClick Keyboard Events                    onKeyDown                    onKeyPress                    onKeyUp Focus Events                  onFocus   onBlur To capture an event handler for the capture phase, append capture to the event name. For example, instead of using onClick, use onClickCapture to handle the click event.  Capture event example:                  Click me    Additional ExamplesExample1                       Import React from ‘...react’                         function clickAppHandler() {                                function clickHandler() {                                        console.log(‘clicked’)                                         }                                  return (                                                                                  Click                                                                          )                         }                       export default clickAppHandler   Example2       This example is along with HTML in a single file                                                            Events                               function testApp (){                        alert((“Hello Event”);                                                   test Clicked                  test double Clicked                     Adding Events: Below example is how you add an event. Highlighted in bold                      Import React from ‘...react’                         function clickAppHandler() {                                function clickHandler() {                                        console.log(‘clicked’)                                         }                                  return (                                                                                  Click                                                                          )                         }                       export default clickAppHandler  Passing Arguments to Event HandlerThere are two ways arguments are passed to event handler  Arrow function                    this.handleClick(id,e)}>Click                onClick is the event                e is the event object                 id can be state or props or some data Bind method      Click  In this case event object is automatically passed In both methods e represents the react event and its passed after the ID as second argument,With an arrow function this event e is passed explicitly but with bind method its automatically passed.                                     Import React,{ Component } from “react”;                                         class TestApp extends Component {                                           state = {                                                       id: 2,                                                      Name: “TestApp Dummy”                                                };                                                             //arrow function                                                 handleClick = (id,e) => {                                                       console.log(id);                                                       console.log(e);                                                  };                                               handleArg = (e) => { this.handleClick(this.state.id,e);}                                                          render() {     return (                    TestApp,{this.state.name}            onClick={this.handleArg}>Display            );   }  }  The react event is an object and obtained from react. Instead of creating a separate function for passing argument, you can directly pass the anonymous arrow function as shown in the render function below:     render() {        return (                                                                                                       TestApp,{this.state.name}                                                {                           this.handleClick(this.state.id,e);                                                               }}>Display                                                                                                         );                                                 }                                            }    Output:   click on button  “TestApp Dummy “                   Let’s see only how bind method looks like in the render function    render() {                                         return (                                                                                                 TestApp,{this.state.name}                                                   Display                                                                                                       );                                                  }                                              } Output: this will display the h1 tag and when you click the button handleClick function gets invoked and the console will display id of the state object as shown above. Building a Practice to Thoroughly Understand Events This blog focuses on event handling, which in turn teaches about event handlers declared in JSX markup.This approach helps in tracking down the element mapped with events in an easy way.  We also learned how to handle multiple event handlers in a single element by using JSX attributes.we also learned about ways to bind event handler and  parameter values. Then we learned about synthetic events which are abstractions around native events. The best way you can retain this learning is by practicing more and tackling the complexities that may arise as you practice. You can find several tutorials on the internet or share your questions with us here. Happy learning! 
5355
Handling React Events - A Detailed Guide

Event handling essentially allows the user to inte... Read More

MongoDB Query Document Using Find() With Example

MongoDB's find() method selects documents from a collection or view and returns a cursor to those documents. There are two parameters in this formula: query and projection.Query – This is an optional parameter that specifies the criteria for selection. In simple terms, a query is what you want to search for within a collection.Projection – This is an optional parameter that specifies what should be returned if the query criteria are satisfied. In simple terms, it is a type of decision-making that is based on a set of criteria.MongoDB's Flexible SchemaA NoSQL database, which stands for "not only SQL," is a way of storing and retrieving data that is different from relational databases' traditional table structures (RDBMS).When storing large amounts of unstructured data with changing schemas, NoSQL databases are indeed a better option than RDBMS. Horizontal scaling properties of NoSQL databases allow them to store and process large amounts of data.These are intended for storing, retrieving, and managing document-oriented data, which is frequently stored in JSON format (JavaScript Object Notation). Document databases, unlike RDBMSs, have a flexible schema that is defined by the contents of the documents.MongoDB is one of the most widely used open-source NoSQL document databases. MongoDB is known as a 'schemaless' database because it does not impose a specific structure on documents in a collection.MongoDB is compatible with a number of popular programming languages. It also offers a high level of operational flexibility because it scales well horizontally, allowing data to be spread or 'sharded' across multiple commodity servers with the ability to add more servers as needed. MongoDB can be run on a variety of platforms, including developer laptops, private clouds, and public clouds.Querying documents using find()MongoDB queries are used to retrieve or fetch data from a MongoDB database. When running a query, you can use criteria or conditions to retrieve specific data from the database.The function db.collection is provided by MongoDB. find() is a function that retrieves documents from a MongoDB database.In MongoDB, the find method is used to retrieve a specific document from the MongoDB collection. In Mongo DB, there are a total of six methods for retrieving specific records.find()findAndModify()findOne()findOneAndDelete()findOneAndReplace()findOneAndUpdate()Syntax:find(query, projection)We can fetch a specific record using the Find method, which has two parameters. If these two parameters are omitted, the find method will return all of the documents in the MongoDB collection.Example:Consider an example of employees with the database of employee_id and employee_name and we will fetch the documents using find() method.First, create a database with the name “employees” with the following code:use employeesNow, create a collection “employee” with:db.createCollection("employee")In the next step we will insert the documents in the database:db.employee.insert([{employee_id: 101, employee_name: "Ishan"}, {employee_id: 102, employee_name: "Bhavesh"}, {employee_id: 103, employee_name: "Madan"}])Find all Documents:To get all the records in a collection, we need to use the find method with an empty parameter. In other words, when we need all the records, we will not use any parameters.db.employee.find()Output in Mongo ShellThe pretty() method can be used to display the results in a formatted manner.Syntax:db.COLLECTION_NAME.find().pretty()Let’s check our documents with pretty() method:Query FiltersWe will see examples of query operations using the db.collection.find() method in mongosh.We will use the employee collection in the employees database.db.employee.insert([{employee_id: 101, employee_name: "Ishan", age: 21, email_id: "ishanjain@gmail.com"}, {employee_id: 102, employee_name: "Bhavesh", age: 22, email_id: "bhaveshg@gmail.com"}, {employee_id: 103, employee_name: "Madan", age: 23, email_id: "madan@gmail.com"}])As we have seen earlier that to select all the documents in the database we pass an empty document as the query filter parameter to the find method.db.employee.find().pretty()Find the first document in a collection:db.employee.findOne()Find a document by ID:db.employee.findOne({_id : ObjectId("61d1ae0b56b92c20b423a5a7")})Find Documents that Match Query Criteriadb.employee.find({“age”: “22”})db.employee.find({"employee_name": "Madan"}).pretty()Sort Results by a Field:db.employee.find().sort({age: 1}).pretty()order by age, in ascending orderdb.employee.find().sort({age: -1}).pretty()order by age, in descending orderAND Conditions:A compound query can specify conditions for multiple fields in the documents in a collection. A logical AND conjunction connects the clauses of a compound query indirectly, allowing the query to select all documents in the collection that meet the specified conditions.In the following example, we will consider all the documents in the employee collection where employee_id equals 101 and age equals 21.db.employee.find({"employee_id": 101, "age": "21" }).pretty()Querying nested fieldsThe embedded or nested document feature in MongoDB is a useful feature. Embedded documents, also known as nested documents, are documents that contain other documents.You can simply embed a document inside another document in MongoDB. Documents are defined in the mongo shell using curly braces (), and field-value pairs are contained within these curly braces.Using curly braces, we can now embed or set another document inside these fields, which can include field-value pairs or another sub-document.Syntax:{ field: { field1: value1, field2: value2 } }Example:We have a database “nested” and in this database we have collection “nesteddoc”.The following documents will insert into the nesteddoc collection.db.nesteddoc.insertMany([ { "_id" : 1, "dept" : "A", "item" : { "sku" : "101", "color" : "red" }, "sizes" : [ "S", "M" ] }, { "_id" : 2, "dept" : "A", "item" : { "sku" : "102", "color" : "blue" }, "sizes" : [ "M", "L" ] }, { "_id" : 3, "dept" : "B", "item" : { "sku" : "103", "color" : "blue" }, "sizes" : "S" }, { "_id" : 4, "dept" : "A", "item" : { "sku" : "104", "color" : "black" }, "sizes" : [ "S" ] } ])Place the documents in the collection now. Also, take a look at the results:As a result, the nesteddoc collection contains four documents, each of which contains nested documents. The find() method can be used to access the collection's documents.db.nesteddoc.find()Specify Equality Condition:In this example, we will select the document from the nesteddoc query where dept equals “A”.db.nesteddoc.find({dept: "A"})Querying ArraysUse the query document {: } to specify an equality condition on an array, where is the exact array to match, including the order of the elements.The following query looks for all documents where the field tags value is an array with exactly two elements, "S" and "M," in the order specified:db.nesteddoc.find( { sizes: ["S", "M"] } )Use the $all operator to find an array that contains both the elements "S" and "M," regardless of order or other elements in the array:db.nested.find( { sizes: { $all: ["S", "M"] } } )Query an Array for an Element:The following example queries for all documents where size is an array that contains the string “S” as one of its elements:db.nesteddoc.find( { sizes: "S" } )Filter conditionsTo discuss the filter conditions, we will consider a situation that elaborates this. We will start by creating a collection with the name “products” and then add the documents to it.db.products.insertMany([ { _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] }, { _id: 2, item: { name: "cd", code: "123" }, qty: 20, tags: [ "B" ] }, { _id: 3, item: { name: "ij", code: "456" }, qty: 25, tags: [ "A", "B" ] }, { _id: 4, item: { name: "xy", code: "456" }, qty: 30, tags: [ "B", "A" ] }, { _id: 5, item: { name: "mn", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }])To check the documents, use db.products.find():$gt$gt selects documents with a field value greater than (or equal to) the specified value.db.products.find( { qty: { $gt: “20” } } )$gte:$gte finds documents in which a field's value is greater than or equal to (i.e. >=) a specified value (e.g. value.)db.products.find( { qty: { $gte: 20 } } )$lt:$lt selects documents whose field value is less than (or equal to) the specified value.db.products.find( { qty: { $lt: 25 } } )$lte:$lte selects documents in which the field's value is less than or equal to (i.e. =) the specified value.db.products.find( { qty: { $lte: 20 } } )Query an Array by Array Length:To find arrays with a specific number of elements, use the $size operator. For example, the following selects documents with two elements in the array.db.products.find( { "tags": {$size: 2} } )ProjectionIn MongoDB, projection refers to selecting only the data that is required rather than the entire document's data. If a document has five fields and you only want to show three of them, select only three of them.The find() method in MongoDB accepts a second optional parameter, which is a list of fields to retrieve, as explained in MongoDB Query Document. When you use the find() method in MongoDB, it displays all of a document's fields. To prevent this, create a list of fields with the values 1 or 0. The value 1 indicates that the field should be visible, while 0 indicates that it should be hidden.Syntax:db.COLLECTION_NAME.find({},{KEY:1})Example:We will consider the previous example of products collection. Run the below command on mongoshell to learn how projection works:db.products.find({},{"tags":1, _id:0})Keep in mind that the _id field is always displayed while executing the find() method; if you do not want this field to be displayed, set it to 0.Optimized FindingsTo retrieve a document from a MongoDB collection, use the Find method.Using the Find method, we can retrieve specific documents as well as the fields that we require. Other find methods can also be used to retrieve specific documents based on our needs.By inserting array elements into the query, we can retrieve specific elements or documents. To retrieve data for array elements from the collection in MongoDB, we can use multiple query operators.
6495
MongoDB Query Document Using Find() With Example

MongoDB's find() method selects documents from a c... Read More

Implementing MongoDb Map Reduce using Aggregation

Algorithms and applications in today's data-driven market collect data about people, processes, systems, and organisations 24 hours a day, seven days a week, resulting in massive amounts of data. The problem is figuring out how to process this massive amount of data efficiently without sacrificing valuable insights.What is Map Reduce? The MapReduce programming model comes to the rescue here. MapReduce, which was first used by Google to analyse its search results, has grown in popularity due to its ability to split and process terabytes of data in parallel, generating results faster. A (Key,value) pair is the basic unit of information in MapReduce. Before feeding the data to the MapReduce model, all types of structured and unstructured data must be translated to this basic unit. The MapReduce model, as the name implies, consists of two distinct routines: the Map-function and the Reduce-function.  MapReduce is a framework for handling parallelizable problems across huge files using a huge number of devices (nodes), which are collectively referred to as a cluster (if all nodes are on the same local network and use similar hardware) or a grid (if the nodes are shared across geographically and administratively distributed systems, and use more heterogeneous hardware).  When data stored in a filesystem (unstructured) or a database(structured) is processed, MapReduce can take advantage of data's locality, processing it close to where it's stored to reduce communication costs. Typically, a MapReduce framework (or system) consists of three operations: Map: Each worker node applies the map function to local data and saves the result to a temporary storage. Only one copy of the redundant input data is processed by a master node. Shuffle: worker nodes redistribute data based on output keys (produced by the map function), ensuring that all data associated with a single key is stored on the same worker node. Reduce: each group of output data is now processed in parallel by worker nodes, per key. This article will walk you through the Map-Reduce model's functionality step by step. Map Reduce in MongoDB The map-reduce operation has been deprecated since MongoDB 5.0. An aggregation pipeline outperforms a map-reduce operation in terms of performance and usability. Aggregation pipeline operators like $group, $merge, and others can be used to rewrite map-reduce operations. Starting with version 4.4, MongoDB provides the $accumulator and $function aggregation operators for map-reduce operations that require custom functionality. In JavaScript, use these operators to create custom aggregation expressions. The map and reduce functions are the two main functions here. As a result, the data is independently mapped and reduced in different spaces before being combined in the function and saved to the specified new collection. This mapReduce() function was designed to work with large data sets only. You can perform aggregation operations like max and avg on data using Map Reduce, which is similar to groupBy in SQL. It works independently and in parallel on data. Implementing Map Reduce with Mongosh (MongoDB Shell)  The db.collection.mapReduce() method in mongosh is a wrapper for the mapReduce command. The examples that follow make use of the db.collection.mapReduce(). Example: Create a collection ‘orders’ with these documents: db.orders.insertMany([     { _id: 1, cust_id: "Ishan Jain", ord_date: new Date("2021-11-01"), price: 25, items: [ { sku: "oranges", qty: 5, price: 2.5 }, { sku: "apples", qty: 5, price: 2.5 } ], status: "A" },     { _id: 2, cust_id: "Ishan Jain", ord_date: new Date("2021-11-08"), price: 70, items: [ { sku: "oranges", qty: 8, price: 2.5 }, { sku: "chocolates", qty: 5, price: 10 } ], status: "A" },     { _id: 3, cust_id: "Bhavesh Galav", ord_date: new Date("2021-11-08"), price: 50, items: [ { sku: "oranges", qty: 10, price: 2.5 }, { sku: "pears", qty: 10, price: 2.5 } ], status: "A" },     { _id: 4, cust_id: "Bhavesh Galav", ord_date: new Date("2021-11-18"), price: 25, items: [ { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" },     { _id: 5, cust_id: "Bhavesh Galav", ord_date: new Date("2021-11-19"), price: 50, items: [ { sku: "chocolates", qty: 5, price: 10 } ], status: "A"},     { _id: 6, cust_id: "Madan Parmar", ord_date: new Date("2021-11-19"), price: 35, items: [ { sku: "carrots", qty: 10, price: 1.0 }, { sku: "apples", qty: 10, price: 2.5 } ], status: "A" },     { _id: 7, cust_id: "Madan Parmar", ord_date: new Date("2021-11-20"), price: 25, items: [ { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" },     { _id: 8, cust_id: "Abhresh", ord_date: new Date("2021-11-20"), price: 75, items: [ { sku: "chocolates", qty: 5, price: 10 }, { sku: "apples", qty: 10, price: 2.5 } ], status: "A" },     { _id: 9, cust_id: "Abhresh", ord_date: new Date("2021-11-20"), price: 55, items: [ { sku: "carrots", qty: 5, price: 1.0 }, { sku: "apples", qty: 10, price: 2.5 }, { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" },     { _id: 10, cust_id: "Abhresh", ord_date: new Date("2021-11-23"), price: 25, items: [ { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" }  ]) Apply a map-reduce operation to the orders collection to group them by cust_id, then add the prices for each cust_id: To process each input document, define the map function: this refers the document that the map-reduce operation is processing in the function. For each document, the function maps the price to the cust_id and outputs the cust_id and price. var mapFunction1 = function() {emit(this.cust_id, this.price);}; With the two arguments keyCustId and valuesPrices, define the corresponding reduce function: The elements of the valuesPrices array are the price values emitted by the map function, grouped by keyCustId. The valuesPrice array is reduced to the sum of its elements by this function. var reduceFunction1 = function(keyCustId, valuesPrices) {return Array.sum(valuesPrices);};Apply the mapFunction1 map function and the reduceFunction1 reduce function to all documents in the orders collection: db.orders.mapReduce(mapFunction1,reduceFunction1,{ out: "map_reduce_example" }) The results of this operation are saved in the map_reduce_example collection. If the map_reduce_example collection already exists, the operation will overwrite its contents with the map-reduce operation's results. Check the map_reduce_example collection to verify: db.map_reduce_example.find().sort( { _id: 1 } ) Aggregation Alternative:You can rewrite the map-reduce operation without defining custom functions by using the available aggregation pipeline operators: db.orders.aggregate([{$group: { _id:"$cust_id",value:{$sum: "$price" } } },{ $out: "agg_alternative_1" }]) Check the agg_alternative_1 collection to verify: db.agg_alternative_1.find().sort( { _id: 1 } )Implementing Map Reduce with Java Consider the collection car and insert the following documents in it. db.car.insert( [ {car_id:"c1",name:"Audi",color:"Black",cno:"H110",mfdcountry:"Germany",speed:72,price:11.25}, {car_id:"c2",name:"Polo",color:"White",cno:"H111",mfdcountry:"Japan",speed:65,price:8.5}, {car_id:"c3",name:"Alto",color:"Silver",cno:"H112",mfdcountry:"India",speed:53,price:4.5}, {car_id:"c4",name:"Santro",color:"Grey",cno:"H113",mfdcountry:"Sweden",speed:89,price:3.5} , {car_id:"c5",name:"Zen",color:"Blue",cno:"H114",mfdcountry:"Denmark",speed:94,price:6.5} ] ) You will get an output like this:  Let's now write the map reduce function on a collection of cars, grouping them by speed and classifying them as overspeed cars.  var speedmap = function (){  var criteria;  if ( this.speed > 70 ) {criteria = 'overspeed';emit(criteria,this.speed);}}; Based on the speed, this function classifies the vehicle as an overspeed vehicle. The term "this" refers to the current document that requires map reduction. var avgspeed_reducemap = function(key, speed) {       var total =0;       for (var i = 0; i 
7344
Implementing MongoDb Map Reduce using Aggregation

Algorithms and applications in today's data-driven... Read More