Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何解决;无法读取未定义的属性";在Node.js中_Javascript_Node.js_Csv_Automated Tests - Fatal编程技术网

Javascript 如何解决;无法读取未定义的属性";在Node.js中

Javascript 如何解决;无法读取未定义的属性";在Node.js中,javascript,node.js,csv,automated-tests,Javascript,Node.js,Csv,Automated Tests,我是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

我是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:

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

问题如下:为什么我可以在“valuesTest”块中使用变量“dataProvider”,它工作正常并返回城市变量的值,但在“for”循环中我不能使用它(变量“dataProvider”、“CITY”等不可用),尽管它们位于同一块“Descripte”中.

您的CSV阅读器是一个异步操作。我怀疑您的for循环甚至在csv被解析并返回值之前就已经执行了。尝试将for循环放入函数中,并将其作为回调传递给readFromCsv函数。在数据事件上调用此函数,您将确保从中获取数据。

您应该将回调传递到
readFromCsv
,该回调将在
createReadStream
完成时执行。您可以通过侦听
end
事件来确定
createReadStream
何时完成。(例如,见)

在您的情况下,您可以执行以下操作:

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);
    } 
});
readFromCsv(路径,ONED){
让结果=[];
fs.createReadStream(路径)
.pipe(csv())
.on('data',(data)=>results.push(data))
.on('end',()=>onEnd(results));
}
readFromCsv(“test/resources/places.csv”,函数onData(data){
for(设i=0;i
您应该使用
end
事件而不是
data
事件来确定流何时完成。如果在第一次
数据
事件之后返回,则可能无法获取所有数据


data
事件在每个数据块中触发一次。如果您的数据有多个“块”,则在返回数据回调时将截断它。有关不同事件类型的详细信息,请参阅。您可能没有注意到小测试文件之间的差异,但如果创建一个较大的文件,您就会看到差异。

您有一个输入错误
dataProvider1[0]。CITY
应该是
dataProvider[0]。CITY
@Paulpro不,这不是问题。它在那里工作(我已经修复了它),但是它在循环“for”中不工作
就在
for
循环开始之前,告诉我输出是什么
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);
    } 
});