使用module.exports返回一个对象

时间:2016-05-08 23:50:56

标签: javascript node.js

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

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

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

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:2)

您未在任何地方调用loadPortfolio()功能,您在app.js文件中使用了错误的变量名称,并且可以移动module.exports以提高可读性

  

最后一部分是可选的,但可以很容易地看到导出的内容   打开后立即打开每个文件的顶部

     

注意:仅当您使用命名函数定义时才有效:function myFunc() {}当您将函数存储在变量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);

答案 1 :(得分:2)

导出的模块必须是一个以回调作为参数的函数。导出的函数将为回调提供异步生成的数据。

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'
});

编辑:如果要在portfolioObj的回调上下文之外使用异步提取的loadPortfolio,则必须设置未定义的变量,然后在回调中分配它。

//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'
}

然而,一种更简洁的方法就是承诺。