Javascript 如何解决;无法读取未定义的属性";在Node.js中
我是JS的新手,我需要为测试数据创建简单的CSV解析器。我有一个非常奇怪的问题 这是我的测试代码: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
'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);
}
});