使用module.exports返回一个对象

我正在使用csvtojsonparsing一个csv文件,并希望在NodeJS的另一个模块中使用它。 很确定这是一个noob问题,我试图学习NodeJS。

function loadPortfolio (portfolio) { //Converter Class var Converter = require("./node_modules/csvtojson").Converter; var converter = new Converter({}); //end_parsed will be emitted once parsing finished converter.on("end_parsed", function (jsonArray) { var jsonText = JSON.stringify(jsonArray); var portfolioObj = JSON.parse(jsonText); module.exports = loadPortfolio; }); //read from file require("fs").createReadStream("./charlesriverexport.csv").pipe(converter); }; 

然后在我的app.js文件中:

 var loadPortfolio = require('./loadPortfolio'); console.log("Portfolio: ", portfolio); 

但不幸的是,投资组合对象是未定义的。

有任何想法吗?

谢谢

你的导出模块必须是一个以callback为参数的函数。 导出的函数将为callback提供asynchronous生成的数据。

 var fs = require('fs'); var Converter = require('./node_modules/csvtojson').Converter; module.exports = function loadPortfolio (callback) { var converter = new Converter({}); fs.createReadStream('./charlesriverexport.csv').pipe(converter); converter.on('end_parsed', function (jsonArray) { var jsonText = JSON.stringify(jsonArray); var portfolioObj = JSON.parse(jsonText); callback(portfolioObj); }); }; 

在你使用这个模块的文件中:

 var loadPortfolio = require('./loadPortfolio'); loadPortfolio(function(portfolioObj) { console.log(typeof portfolioObj); // => 'object' }); 

编辑:如果你想在loadPortfolio的callback上下文之外使用asynchronous获取的portfolioObj ,你必须设置一个未定义的variables,然后在callback中分配它。

 //set undefined variable var portfolio; //import your function require('./loadPortfolio')(function(portfolioObj) { //assign the global variable a value portfolio = portfolioObj; //when doSomething runs portfolio is guaranteed to be defined doSomething(); }); //see the problem with calling doSomething outside the callback? doSomething(); // => 'undefined' function doSomething() { console.log(typeof portfolio); // => 'object' } 

然而,一个干净利落的方法是承诺。

你不是在任何地方调用loadPortfolio()函数,你的app.js文件中使用了错误的variables名,并且可以移动你的module.exports来提高可读性

最后一部分是可选的,但只要打开它,可以很容易地看到每个文件顶部的输出内容

注意:这只适用于使用命名函数定义: function myFunc() {}而不是当您将函数存储在variables,即let myFunc = function() {}

在JS中提升允许在模块文件中执行此操作:

 module.exports = loadPortfolio; function loadPortfolio (portfolio) { //Converter Class var Converter = require("./node_modules/csvtojson").Converter; var converter = new Converter({}); //end_parsed will be emitted once parsing finished converter.on("end_parsed", function (jsonArray) { var jsonText = JSON.stringify(jsonArray); var portfolioObj = JSON.parse(jsonText); }); //read from file require("fs").createReadStream("./charlesriverexport.csv").pipe(converter); }; 

当函数在模块执行之前被加载,你可以在函数定义之前导出。

那么你需要调用app.js中的函数

 var loadPortfolio = require('./loadPortfolio'); var portfolio = loadPortfolio(); console.log("Portfolio: ", portfolio);