Node.js 节点异步。模块间变量的瀑布式传递

Node.js 节点异步。模块间变量的瀑布式传递,node.js,asynchronous,module,Node.js,Asynchronous,Module,我在使用async.瀑布时在模块之间传递变量时遇到问题。这是我的主要跑步者 var async = require('async'); var helpers = require('./1-helpers'); var file = process.argv[2]; var body = ''; async.waterfall([helpers.getURL, helpers.openURL, helpers.printBody]); 和函数都在这个文件中 var fs = require

我在使用async.瀑布时在模块之间传递变量时遇到问题。这是我的主要跑步者

var async = require('async');
var helpers = require('./1-helpers');

var file = process.argv[2];
var body = '';

async.waterfall([helpers.getURL, helpers.openURL, helpers.printBody]);
和函数都在这个文件中

var fs = require('fs');
var http = require('http');

module.exports = {

  getURL: function (done) {
    fs.readFile(file, 'utf8', this.gotFileData);
  },

  gotFileData: function (err, url) {
    if (err) return done(err);
    done(null, url);
  },

  openURL: function (url, done) {   
    http.get(url, this.handleResponse).on('error', function (e) {
      done(e);
    });
  },

  handleResponse: function (res) {
    res.on('data', this.readChunk);
    res.on('end', function gotBody (chunk) {
      done(null, body);
    });
  },

  readChunk: function (chunk) {
    body += chunk.toString();
  },

  printBody: function (err, body) {
    if (err) return console.error(err);
    console.log(body);
  }

}
这就是我得到的错误:

/Users/wimo/dev/nodejs/async-you/1-helpers.js:7
    fs.readFile(file, 'utf8', this.gotFileData);
            ^

ReferenceError: file is not defined
    at getURL (/Users/wimo/dev/nodejs/async-you/1-helpers.js:7:17)
    at nextTask (/Users/wimo/dev/nodejs/async-you/node_modules/async/dist/async.js:5021:18)
    at Object.waterfall (/Users/wimo/dev/nodejs/async-you/node_modules/async/dist/async.js:5024:9)
    at Object.<anonymous> (/Users/wimo/dev/nodejs/async-you/1.js:7:7)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.runMain (module.js:590:10)
/Users/wimo/dev/nodejs/async you/1-helpers.js:7
fs.readFile(文件'utf8',this.gotFileData);
^
ReferenceError:未定义文件
在getURL(/Users/wimo/dev/nodejs/async you/1-helpers.js:7:17)
在下一个任务(/Users/wimo/dev/nodejs/async you/node_modules/async/dist/async.js:5021:18)
在Object.falter(/Users/wimo/dev/nodejs/async you/node_modules/async/dist/async.js:5024:9)
反对。(/Users/wimo/dev/nodejs/async you/1.js:7:7)
在模块处编译(Module.js:556:32)
在Object.Module._extensions..js(Module.js:565:10)
在Module.load(Module.js:473:32)
在TryModule加载时(module.js:432:12)
在Function.Module.\u加载(Module.js:424:3)
位于Module.runMain(Module.js:590:10)
关于通过async.瀑布函数传递'file'和'body'变量,有什么提示吗

非常感谢,, main.js中的Wim

传递async.瀑布中的第一个函数async.constant这将把变量文件作为参数传递给getURL函数。参考和

在helper.js中

var fs = require('fs');
var http = require('http');
module.exports = {
 getURL: function (file, callback) {
  fs.readFile(file, 'utf8', function (err, fileData) {
   if (err) {
    callback(err);
    return;
   }
   callback(null, fileData);
  });
 },
 openURL: function (url, callback) {
  http.get(url, function (err, httpResponse) {
   if (err) {
    callback(err);
    return;
   }
  callback(null, httpResponse);
  });
 },
 printBody: function (httpResponse, callback) {
  httpResponse.on('data', function (chunk) {
  console.log(chunk);
  callback(null, 'done');
 });
 }
}
js使用回调来确定是否发生了错误,回调的参数将传递给下一个任务。 在这里,fs.readile函数的结果fileData被传递给getURL(下一个任务)。因此,url获取fileData的值

在main.js中

传递async.瀑布中的第一个函数async.constant这将把变量文件作为参数传递给getURL函数。参考和

在helper.js中

var fs = require('fs');
var http = require('http');
module.exports = {
 getURL: function (file, callback) {
  fs.readFile(file, 'utf8', function (err, fileData) {
   if (err) {
    callback(err);
    return;
   }
   callback(null, fileData);
  });
 },
 openURL: function (url, callback) {
  http.get(url, function (err, httpResponse) {
   if (err) {
    callback(err);
    return;
   }
  callback(null, httpResponse);
  });
 },
 printBody: function (httpResponse, callback) {
  httpResponse.on('data', function (chunk) {
  console.log(chunk);
  callback(null, 'done');
 });
 }
}
js使用回调来确定是否发生了错误,回调的参数将传递给下一个任务。
在这里,fs.readile函数的结果fileData被传递给getURL(下一个任务)。因此,url获取fileData的值

太好了,谢谢你,希曼尼!我改用async.apply,它可以很好地传递“file”变量。太好了,谢谢Himani!我改用async.apply,它可以很好地传递“file”var。