我正在使用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);
但是,不幸的是,投资组合对象是未定义的。
有什么想法吗?
由于
答案 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'
}
然而,一种更简洁的方法就是承诺。