error handling in asynchronous node.js calls

前端 未结 10 1676
感动是毒
感动是毒 2020-12-12 19:32

I\'m new to node.js although I\'m pretty familiar with JavaScript in general. My question is regarding \"best practices\" on how to handle errors in node.js.

Normall

10条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-12 20:04

    I've recently created a simple abstraction named WaitFor to call async functions in sync mode (based on Fibers): https://github.com/luciotato/waitfor

    It's too new to be "rock solid".

    using wait.for you can use async function as if they were sync, without blocking node's event loop. It's almost the same you're used to:

    var wait=require('wait.for');
    
    function handleRequest(request, response) {
          //launch fiber, keep node spinning
          wait.launchFiber(handleinFiber,request, response); 
    }
    
    function handleInFiber(request, response) {
      try {
        if (request.url=="whatever")
          handleWhateverRequest(request, response);
        else
          throw new Error("404 not found");
    
      } catch (e) {
        response.writeHead(500, {'Content-Type': 'text/plain'});
        response.end("Server error: "+e.message);
      }
    }
    
    function handleWhateverRequest(request, response, callback) {
      if (something) 
        throw new Error("something bad happened");
      Response.end("OK");
    }
    

    Since you're in a fiber, you can program sequentially, "blocking the fiber", but not node's event loop.

    The other example:

    var sys    = require('sys'),
        fs     = require('fs'),
        wait   = require('wait.for');
    
    require("http").createServer( function(req,res){
          wait.launchFiber(handleRequest,req,res) //handle in a fiber
      ).listen(8124);
    
    function handleRequest(request, response) {
      try {
        var fd=wait.for(fs.open,"/proc/cpuinfo", "r");
        console.log("File open.");
        var buffer = new require('buffer').Buffer(10);
    
        var bytesRead=wait.for(fs.read,fd, buffer, 0, 10, null);
    
        buffer.dontTryThisAtHome();  // causes exception
    
        response.end(buffer);
      }
      catch(err) {
        response.end('ERROR: '+err.message);
      }
    
    }
    

    As you can see, I used wait.for to call node's async functions in sync mode, without (visible) callbacks, so I can have all the code inside one try-catch block.

    wait.for will throw an exception if any of the async functions returns err!==null

    more info at https://github.com/luciotato/waitfor

提交回复
热议问题