javascript - 如何解决 UnhandledPromiseRejectionWarning: Unhandled Promise Rejection: TypeError: Only absolute URLs are supported?节点.js
问题描述
我正在尝试使用 Node.js 运行此代码,但我总是遇到同样的错误:
(node:9092) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: Only absolute URLs are supported
(node:9092) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
我尝试过很多事情,比如粘贴整个路径或删除所有内容,但我不知道,我的错误是什么。我是否删除该d3.csv(..)
方法或csvWriter
两者都没有关系。我在使用和不使用 then/catch 或 Promise 的情况下对其进行了测试,但没有任何变化。我尝试使用 only 运行一个简单的代码,console.log("test");
并且它有效,所以它不是 Node.js 不起作用。这是我的代码:
const fs = require('fs');
const d3 = require('d3');
global.fetch = require("node-fetch");
new Promise((resolve, reject) => {
d3.csv(".\\dat\\Meteorite_Landings.csv")}).then(function(data) {
//parse strings to numbers
data.forEach(function(d) {
var date;
if (d.year){
date = new Date (d.year);}
else{
date = null;
}
d["mass (g)"] = +d["mass (g)"];
d.reclat = +d.reclat;
d.reclong = +d.reclong;
d.date = date;
d.year = date? date.getYear() +1900 : null;
})
.catch((error) => {
assert.isNotOk(error);
});
console.log(data[0]);
createTimeLineData(data);
//createThemeRiver(data);
});
function filterYear(data){
/** Eliminate data without year */
filteredData = [];
data.forEach(function(item){
if(item.year){
filteredData.push(item);
}
});
return filteredData;
}
function getAllYears(data){
var yearArray=[];
data.forEach((item)=>{
/** creates array of all given years */
if(0 > yearArray.indexOf(item.year)){
yearArray.push(item.year);
}
});
return yearArray;
}
function createTimeLineData(rawData){
var data = filterYear(rawData);
var yearArray = (getAllYears(data)).sort();
csvWriter(yearArray);
}
function csvWriter(data){
const createCsvWriter = require("csv-writer").createObjectCsvWriter;
const csvWriter = createCsvWriter({path: 'trData.csv'});
new Promise((resolve, reject) => {
csvWriter.writeRecords(data)}).then(()=> console.log("success"))
.catch((error) => {
assert.isNotOk(error);
});
}
有谁知道我做错了什么?
解决方案
您的代码似乎没有以预期的方式使用 Promises。Promise 应该用于包装异步操作,并且应该调用resolve()
or reject()
(并确定它是否进入调用该 Promise 的人的then()
or块)。catch()
使用异步代码时的一些最佳实践是始终返回函数所期望的值(即使它们是 Promise 时更是如此!),并减少catch
块的数量,以避免您的 Promise 错误被默默地吞入 Promise 链中.
考虑到这一点,请更改您的代码,如下所示:
const fs = require('fs');
const d3 = require('d3');
global.fetch = require("node-fetch");
d3.csv(".\\dat\\Meteorite_Landings.csv")
.then(function(data) {
//parse strings to numbers
data.forEach(function(d) {
var date;
if (d.year){
date = new Date (d.year);}
else{
date = null;
}
d["mass (g)"] = +d["mass (g)"];
d.reclat = +d.reclat;
d.reclong = +d.reclong;
d.date = date;
d.year = date? date.getYear() +1900 : null;
});
return data;
}).then((data) => {
return createTimeLineData(data);
}).then(() => console.log("success"))
.catch((error) => {
assert.isNotOk(error);
});
function filterYear(data){
/** Eliminate data without year */
filteredData = [];
data.forEach(function(item){
if(item.year){
filteredData.push(item);
}
});
return filteredData;
}
function getAllYears(data){
var yearArray=[];
data.forEach((item)=>{
/** creates array of all given years */
if(0 > yearArray.indexOf(item.year)){
yearArray.push(item.year);
}
});
return yearArray;
}
function createTimeLineData(rawData){
var data = filterYear(rawData);
var yearArray = (getAllYears(data)).sort();
return csvWriter(yearArray);
}
function csvWriter(data){
const createCsvWriter = require("csv-writer").createObjectCsvWriter;
const csvWriter = createCsvWriter({path: 'trData.csv'});
return csvWriter.writeRecords(data);
}
更新:错误消息中描述了真正破坏您的应用程序的原因:TypeError: Only absolute URLs are supported
,所以问题是您在读取 CSV 时使用的是相对路径,但 D3 用于node-fetch
读取 CSV 文件并且 node-fetch不支持相对 URL。
您可能想尝试用 包装 URL path.resolve()
,例如 in d3.csv(path.resolve('/dat/Meteorite_Landings.csv'))
(另外,不要忘记在之前需要路径,用const path = require('path');
)。
推荐阅读
- rule-engine - 使用 List 属性评估对象
- r - 使用 dplyr::mutate 计算“平均销售份额”
- autodesk-forge - 是否可以从 HDRI 文件添加/创建自定义环境
- swiftui - 如何在 SwiftUI 中创建像单元格一样对齐的文本单元格行
- reactjs - React, Typescript, Axios consume response?
- wpf - 如何让 Path 对象停止裁剪到其边界?
- java - 如何在 Java 中比较 2 个不同的 hashmap
- react-native - 如何安全地保存 redux-persist-transform-encrypt 密钥?
- python - SQLAlchemy - 会话返回值,游标不
- javascript - 渲染后如何在反应中获得状态