【问题标题】:node.js: returning an array in a modulenode.js:在模块中返回一个数组
【发布时间】:2014-06-20 17:54:16
【问题描述】:

我刚接触 node.js 和编程本身。我试图在另一个程序中调用一个函数,但我从来没有得到结果。我调用的函数工作正常,结果正确,调用函数也工作正常,但我想返回的数组没有返回。该程序运行没有错误(遗憾的是在控制台上没有输出)。我检查了几个教程,但找不到与我正在做的事情不同的地方。 我试着把“return(result);”在函数的末尾(在关闭最后一个“}”之前)但是这样做数组又是空的。 我很欣赏每一个想法。

问候,尼尔斯

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;

【问题讨论】:

  • 你没有调用任何回调...

标签: arrays node.js function return


【解决方案1】:

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

prog:调用函数:

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;

【讨论】:

  • 也谢谢本。现在我终于可以继续真正的程序了:)
【解决方案2】:

您必须向您的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.readFilefs.readFileSync 允许您在一次操作中读取所有文件内容文本。

【讨论】:

  • 嗨 Saintedlama,非常感谢,很抱歉回复晚了,我想如果有人回答我的问题,我会注意到 :) 以及 Ben 在下面的更改,现在一切正常。我肯定会尝试其他一些读取数据的方法,但首先我需要它来工作。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2014-01-09
  • 2019-03-25
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
相关资源
最近更新 更多