Javascript async.瀑布失去作用域

Javascript async.瀑布失去作用域,javascript,jquery,node.js,asynchronous,express,Javascript,Jquery,Node.js,Asynchronous,Express,我不熟悉javascript,所以这可能是一件微不足道的事情。我正在尝试根据节点JS/Restify的异步模块的瀑布方法来运行一系列函数。这种方法的主要优点是可以将当前回调的“结果”传递给下一个回调,这样就有可能打破“瀑布”并运行下一个中间件 如文档中所述,它的参数是一个函数数组和最后一个中间件 因此,我根据下面的代码设置函数并调用 var fn1 = function(callback){ console.log(req.params.user_id); callback(nu

我不熟悉javascript,所以这可能是一件微不足道的事情。我正在尝试根据节点JS/Restify的异步模块的瀑布方法来运行一系列函数。这种方法的主要优点是可以将当前回调的“结果”传递给下一个回调,这样就有可能打破“瀑布”并运行下一个中间件

如文档中所述,它的参数是一个函数数组和最后一个中间件

因此,我根据下面的代码设置函数并调用

var fn1 = function(callback){
    console.log(req.params.user_id);
    callback(null, req.params.user_id);
};

var fn2 = function(user_id, callback){
    console.log(user_id);
    callback();
}

server.get('/:user_id',
    function(req, res, next){
        async.waterfall([fn1, fn2],
        function(err, result){
            next();
        })
    },
    ...(next middleware)
)
我没有得到预期的结果,因为没有定义req对象。但是,在执行此操作时:

 server.get('/:user_id',
      function(req, res, next){
          async.waterfall([
              function(callback){
                   console.log(req.params.user_id);
                   callback(null, req.params.user_id);
              },
              function(user_id, callback){
                   console.log(user_id);
                   callback();
              }
          ],
          function(err, result){next()});
      },
      ...(next middleware)
  )
我得到了预期的结果,并且req对象在函数1(fn1)的范围内得到了很好的定义

所以我想我错过了一些基本的东西,但不知道从哪里开始


谢谢

闭包在创建函数的范围内工作。而不是执行它们的范围。例如,以下各项应起作用:

server.get('/:user_id', function(req, res, next) {
  var fn1 = function(callback){
      console.log(req.params.user_id);
      callback(null, req.params.user_id);
  };

  var fn2 = function(user_id, callback){
      console.log(user_id);
      callback();
  }

  async.waterfall([fn1, fn2],
    function(err, result){
      next();
    });
});