node.js:返回一个模块中的数组

im新的node.js和编程本身。 我正在尝试在其他程序中调用函数,但是我从来没有得到结果。 我调用的函数工作正常,结果是正确的,调用函数也能正常工作,但是我想返回的数组只是不返回。 该程序运行没有错误(可悲的是没有输出在控制台上)。 我查了几个教程,但无法find与我所做的不同之处。 我试图把“返回(结果)”; 在函数的结尾(在closures最后一个“}”之前),但这样做数组又是空的。 我欣赏每一个想法。

问候,尼尔斯

1. prog: calling the function: var input = require('./einlesen.js'); var output = input.einlesen('GZV.csv', ';', 1, 2, function(err, yay) { console.log(output); }); 2. prog: the function: var einlesen = function(datei, trennzeichen, zelle1, zelle2) { var result = []; //Ergebnis array beinhaltet start und endknoten var fs = require('fs'), //filestream einbinden um fs.open etc zu nutzen data = 'Daten/' + datei; fs.open(data, 'r', function(err, handledata) //zu prüfende Datendatei einbinden { fs.stat(data, function(err,datastats) //dateiinformationen über größe auslesen { var datasize = datastats.size, databuffer = new Buffer(datasize); var dataarray = []; fs.read(handledata, databuffer, 0, datasize, 0, function(err, bytes, datacontent) //Datei zum lesen öffnen { var datalines = datacontent.toString().split("\n"); //array mit Zeilen der Datei füllen for (var i=0; i < datalines.length - 1; i += 1) //Zeile für Zeile die Daten bearbeiten { dataarray[i] = datalines[i].split(trennzeichen); //Zeile aufsplitten dataarray [i][zelle1] = dataarray[i][zelle1].trim(); //Leerezeichen entfernen dataarray [i][zelle1] = dataarray[i][zelle1].trim('\r'); // \r abschneiden if (zelle2 != 'n') { dataarray [i][zelle2] = dataarray[i][zelle2].trim(); //Leerzeichen entfernen dataarray [i][zelle2] = dataarray[i][zelle2].trim('\r'); // \r abschneiden } result[i] = [dataarray[i][zelle1], dataarray[i][zelle2]]; } fs.close(handledata); }); }); }); } exports.einlesen = einlesen; 

结果不会传回给调用者(使用callback)。 这是变化:

编程:调用函数:

 var input = require('./einlesen.js'); input.einlesen('GZV.csv', ';', 1, 2, function(err, output) { console.log(output); }); 

einlesen.js:

注意:最后一个参数“callback”被添加到这个function。 而且,在最后调用callback()来返回结果

 var einlesen = function(datei, trennzeichen, zelle1, zelle2, callback) { var result = []; //Ergebnis array beinhaltet start und endknoten var fs = require('fs'), //filestream einbinden um fs.open etc zu nutzen data = 'Daten/' + datei; fs.open(data, 'r', function(err, handledata, callback) { fs.stat(data, function(err,datastats) { var datasize = datastats.size, databuffer = new Buffer(datasize); var dataarray = []; fs.read(handledata, databuffer, 0, datasize, 0, function(err, bytes, datacontent) { var datalines = datacontent.toString().split("\n"); //array mit Zeilen der Datei füllen for (var i=0; i < datalines.length - 1; i += 1) { dataarray[i] = datalines[i].split(trennzeichen); //Zeile aufsplitten dataarray [i][zelle1] = dataarray[i][zelle1].trim(); //Leerezeichen entfernen dataarray [i][zelle1] = dataarray[i][zelle1].trim('\r'); // \r abschneiden if (zelle2 != 'n') { dataarray [i][zelle2] = dataarray[i][zelle2].trim(); //Leerzeichen entfernen dataarray [i][zelle2] = dataarray[i][zelle2].trim('\r'); // \r abschneiden } result[i] = [dataarray[i][zelle1], dataarray[i][zelle2]]; } fs.close(handledata); callback(null, result); // 1st argument: null means no error, 2nd argument is the reuslt }); }); }); }; exports.einlesen = einlesen; 

你必须给你的einlesen函数添加一个callback函数,并在完成读取和构造result数组之后调用该函数。

 var einlesen = function(datei, trennzeichen, zelle1, zelle2, cb) // Callback function { var result = []; //Ergebnis array beinhaltet start und endknoten var fs = require('fs'), //filestream einbinden um fs.open etc zu nutzen data = 'Daten/' + datei; fs.open(data, 'r', function(err, handledata) //zu prüfende Datendatei einbinden { if (err) { return cb(err); } // Ensure that in case of an error we do not proceed fs.stat(data, function(err,datastats) //dateiinformationen über größe auslesen { if (err) { return cb(err); } // Ensure that in case of an error we do not proceed var datasize = datastats.size, databuffer = new Buffer(datasize); var dataarray = []; fs.read(handledata, databuffer, 0, datasize, 0, function(err, bytes, datacontent) //Datei zum lesen öffnen { // Code removed for clarity... fs.close(handledata); cb(undefined, result); // Now call the callback }); }); }); } 

为清楚起见,删除了一些用于parsing文件数据并生成结果的代码片段。 此代码添加了两个“退出点”,以防将错误传递给callback处理程序。

您也可以考虑使用更简单的方法来读取文件中的所有数据。 fs.readFile和fs.readFileSync允许您在一个操作中读取所有文件内容文本。