簡體   English   中英

如何解決Node.js中的“無法讀取未定義的屬性”

[英]How to resolve “Cannot read property of undefined” in Node.js

我是JS的新手,我需要為測試數據創建簡單的CSV解析器。 我有一個非常奇怪的問題。

這是我測試的代碼:

'use strict';

const assert = require('assert');
const HomePage = require('../pages/HomePage');
const csv = require('../tools/CsvReader');

describe('Check if values are correct', () => {

    let dataProvider = csv.readFromCsv("test/resources/places.csv");

    function valuesTest(city, expectedLat, expectedLong) {
        it('Data must match', () => {
            let searchPlace = HomePage
                .open()
                .findByPlaceName(city)
                .getSearchPlace();
            assert.strictEqual(searchPlace.getLatitude(), expectedLat);
            assert.strictEqual(searchPlace.getLongtitude(), expectedLong);
            console.log(dataProvider[0].CITY);
        });
    }

    for (let i = 0; i < dataProvider.length; i++) {
        valuesTest(dataProvider[i].CITY, dataProvider[i].LAT, dataProvider[i].LONG)
    }

});

和我的CSV閱讀器的代碼:

'use strict';

const csv = require('csv-parser');
const fs = require('fs');

class CsvReader {


    readFromCsv(path) {
        let results = [];

        fs.createReadStream(path)
            .pipe(csv())
            .on('data', (data) => results.push(data));
        return results;
    }

}

module.exports = new CsvReader();

這是我的CSV:

CITY,LAT,LONG
Kyiv,50.447731,30.542721
Lviv,49.839684,24.029716
Ivano-Frankivsk,48.922634,24.711117

問題如下:為什么我可以在“ valuesTest”塊中使用變量“ dataProvider”,它可以正常工作並返回CITY變量的值,但是在“ for”循環中,我不能使用它(變量“ dataProvider”,“ CITY”等在此處不可用),盡管它們位於同一塊“描述”中。

CSV閱讀器是異步操作。 我懷疑您的for循環即使在解析csv並返回值之前也已執行。 嘗試將for循環放入函數中,並作為回調傳遞給readFromCsv函數。 在數據事件上調用此函數,您將在該事件上確保獲得數據。

您應該將回調傳遞給readFromCsv ,當createReadStream完成時將執行該回調。 您可以通過偵聽其end事件來確定createReadStream何時完成。 例如,請參閱csv-parser示例代碼 )。

就您而言,您可以執行以下操作:

readFromCsv(path, onEnd) {
    let results = [];

    fs.createReadStream(path)
        .pipe(csv())
        .on('data', (data) => results.push(data))
        .on('end', () => onEnd(results));
}

csv.readFromCsv("test/resources/places.csv", function onData(data) {
    for (let i = 0; i < data.length; i++) {
        valuesTest(data[i].CITY, data[i].LAT, data[i].LONG);
    } 
});

您應該使用end事件而不是data事件來確定流何時完成。 如果您在第一個data事件之后返回,則可能無法獲取所有數據。

每個數據塊都會觸發一次data事件。 如果您的數據中有多個“塊”,則如果返回數據回調,則會將其截斷。 有關不同事件類型的詳細信息,請參見nodeJS文檔 您可能不會注意到較小的測試文件會有所不同,但是制作較大的文件會看到差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM