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 позволяют вам читать весь текст содержимого файла за одну операцию.

Другие вопросы по тегам