javascript - 如何解决 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”等在此处不可用),尽管它们位于同一块“describe”中。
解决方案
您的 CSV 阅读器是异步操作。我怀疑你的 for 循环甚至在 csv 被解析并返回值之前就被执行了。尝试将您的 for 循环放在一个函数中并作为回调传递给 readFromCsv 函数。在数据事件上调用此函数,您一定会在其中获取数据。
推荐阅读
- java - 如何使用 Curator TestingServer 启动 zookeeper ensemble
- python-3.x - 编写函数体
- python - 在这种情况下,当应用程序关闭时,如何避免类型错误?
- sql - SQL如何在使用INSERT INTO添加到表之前检查值的类型?
- sql - 如何在laravel中获取用户职业为特例的帖子
- java - E/RecyclerView:没有附加适配器;在 recyclerview 跳过布局和视图 0 并且不显示 recyclerview
- python - 在flask_mongoengine中获取大学下的所有学院
- node.js - create-react-app 似乎在编译错误后缓存源文件
- grpc - 如何在 Yocto bitbake 配方中调用 python 模块?
- php - Laravel 8 - 找不到驱动程序:Illuminate\Database\QueryException 找不到驱动程序(SQL:select * from `list`)