Search code examples
node.jsexpressnode-async

Node async waterfall route with functions split in multiple files


I have two functions in separate files that I want to call together in one route using async waterfall. Having trouble setting up the require, invoking the functions, and passing arguments. Where am I going wrong?

route.js

router.get('/bothFunctions', require('./bothFunctions')

bothFunctions.js

var async = require("async")
module.exports = function(req, res, next) {
  var userName = req.user.username
  var oneFunction = require('./oneFunction')
  var twoFunction = require('./twoFunction')
  var asyncFinally = function(err, results) {
    if(err) return res.send(err)
    return res.send(results)
  }
  async.waterfall([oneFunction(userName), twoFunction], asyncFinally)
}

oneFunction.js

var request = require("request")
module.exports = function(userName, callback) {
  request('/address', function(err, res, body) {
    if(err) return (err, null)
    // do stuff with userName
    return(null, arg2)
  }
}

twoFunction.js

var request = require("request")
module.exports = function(err1, arg2, callback) {
  if(err1) return("error", null)
  request('/address', function(err2, res, body) {
    if(err2) return (err2, null)
    // do stuff with arg2
    return(null, "success")
  }
}

Solution

  • Your waterfall functions need to change like : oneFunction.js

    var request = require("request")
    module.exports = function(username){
    return function(callback) {
      request('/address', function(err, res, body) {
        if(err) return (err, null)
        // do stuff with userName
        return(null, arg2)
      }
    }
    }
    

    twoFunction.js

    var request = require("request")
    module.exports = function(arg2, callback) {
      request('/address', function(err2, res, body) {
        if(err2) return (err2, null)
        // do stuff with arg2
        return(null, "success")
      }
    }