使用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);