node.js: возвращение массива в модуле
Я новичок в node.js и программирование само по себе. Я пытаюсь вызвать функцию в другой программе, но я никогда не получаю результат. Функция, которую я вызываю, работает нормально, результат верный, и вызов функции тоже работает нормально, но массив, который я хочу вернуть, просто не возвращается. Программа работает без ошибок (и, к сожалению, без вывода на консоль). Я проверил несколько уроков, но не могу найти разницу с тем, что я делаю. Я пытался поставить "возврат (результат)"; в конце функции (перед закрытием последнего "}"), но при этом массив снова становится пустым. Я ценю каждую идею.
С уважением, Нильс
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;
2 ответа
Результат не передается обратно вызывающей стороне (с помощью обратного вызова). Вот изменение:
прога: вызов функции:
var input = require('./einlesen.js');
input.einlesen('GZV.csv', ';', 1, 2, function(err, output)
{
console.log(output);
});
einlesen.js:
ПРИМЕЧАНИЕ: последний аргумент "обратный вызов" добавлен к этой функции. Кроме того, 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
функция и вызовите эту функцию, как только вы закончили с чтением и построением 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
});
});
});
}
Некоторые фрагменты кода, которые использовались для анализа файловых данных и построения результата, были удалены для ясности. Этот код добавляет две "точки выхода", где код возвращается в случае, если ошибка была передана в обработчик обратного вызова.
Вы можете также рассмотреть возможность использования более простого подхода для чтения всех данных из файла. fs.readFile и fs.readFileSync позволяют вам читать весь текст содержимого файла за одну операцию.