我正在尝试使用 d3
读取 csv 文件在 Node 环境中。因此,我有点困惑“最佳实践”方式是什么以及为什么我不断获得 TypeError
.
我知道对于 d3
的某些模块支持 fetch
的环境必须在场。因此,我目前的代码如下所示:
import * as d3 from "d3";
import fetch from "node-fetch";
global.fetch = fetch;
let data_path = "flightCodes.csv";
// would a d3.csvParse(fs.readFileSync(data_path)) be better?
let data = await d3.csv(data_path, function (err, dat) {
if (err) {
console.log(err);
} else {
console.log(dat);
}
});
console.log(data);
csv 文件位于同一文件夹中,如下所示:orig,dest,orig_codes,dest_codes
Paris,Lyon,"BVA, ORY, CDG",LYS
Paris,Bordeaux,"BVA, ORY, CDG",BOD
Paris,Nantes,"BVA, ORY, CDG",NTE
Madrid,Barcelona,MAD,BCN
Lisboa,Porto,LIS,OPO
我的 package.json
看起来像这样:{
"name": "name",
"version": "1.0.0",
"description": "",
"type": "module",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"d3": "^7.2.0",
"d3-fetch": "^3.0.1",
"node-fetch": "^3.1.0"
}
}
当我做 node script.js
,我得到以下信息,但我不完全明白为什么。有人可能有想法吗?node:internal/errors:464
ErrorCaptureStackTrace(err);
^
TypeError [ERR_INVALID_URL]: Invalid URL
at new NodeError (node:internal/errors:371:5)
at onParseError (node:internal/url:552:9)
at parse (<anonymous>)
at new URL (node:internal/url:632:5)
最佳答案
如果您引用的文件无法通过 URL 获得,则 d3.csv
(使用 fetch)找不到它。在内部,d3.csv
fetches the data然后调用d3.csvParse
解析它。获取数据需要外部 URL,因此您无法引用本地文件。
但是,您可以使用 fs
模块在本地读取文件然后调用d3.csvParse
得到与 d3.csv
相同的结果做!
let data = d3.csvParse(fs.readFileSync(data_path));
此外,您的代码还有另一个问题。签名
d3.csv(path, callback)
已弃用。相反,它将在每一行上执行第二个参数作为解析函数。正确的调用方式是 d3.csv(path).then(callback)
或者const data = await d3.csv(path);
callback(data);
关于javascript - 在 Node 中使用 d3 读取 csv 数据的最佳实践。为什么会出现 TypeError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70294961/