簡體   English   中英

如何解決UnhandledPromiseRejectionWarning:未處理的promise promise:TypeError:僅支持絕對URL? Node.js的

[英]How to solve UnhandledPromiseRejectionWarning: Unhandled promise rejection: TypeError: Only absolute URLs are supported? Node.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或兩者都csvWriter 我使用和不使用then / catch或Promise測試它但沒有任何變化。 我試圖只用console.log("test");運行一個簡單的代碼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()reject() (並確定它是否進入調用該Promise的那個塊的then()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

你可能想嘗試使用path.resolve()包裝URL,就像在d3.csv(path.resolve('/dat/Meteorite_Landings.csv')) (同樣,不要忘記以前需要路徑,使用const path = require('path'); )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM