javascript - 在 node.js 中使用来自 HTTP 请求的数据

标签 javascript node.js httprequest

我的任务是从http://services.swpc.noaa.gov/text/ace-swepam.txt中获取数据并将其拆分/分类为有用的东西。首先,我试图将数据分成几类,以便我以后可以在 chart.js 或其他东西中使用,但是当我尝试打印一个字段时,它只是以 [] 的形式出现。

    var options = {
    host: 'services.swpc.noaa.gov',
    path: '/text/ace-swepam.txt',
    port: 80,

    method: 'POST'
};


var req = http.request(options, function (res) {


    res.on('data', function (chunk) {
        //   console.log('BODY: ' + chunk);
        results += chunk.toString();
        //split results into an array by each new line
        lines = results.split("\n");
        //delete header lines
        lines.splice(0, 18);
        if (lines.length <= 20) {
            return;
        }
        console.log(lines);

    });
    res.on('end', function (e) {
        callback();

    });

});

req.on('error', function (e) {
    console.log('problem with request: ' + e.message);
});

req.end();

function callback() {
    for (var line in lines) {
        var x = [];
        x = lines[line].split(" ");
        var statuscode = x[14];
        if (statuscode == 0) {
            if (lines[line].indexOf('-') === -1) {
                year.push(x[0]);
                month.push(x[1]);
                day.push(x[2]);
                time.push(x[4]);
                statusno.push(statuscode);
                proton.push(x[22]);
                bulksp.push(x[28]);
                iontemp.push(x[33]);
            }
        }

    }

    //    console.log(year, month, day, time, statusno, proton, bulksp, iontemp)
}

最佳答案

数据行似乎不是制表符分隔的。我希望它们是固定长度的。

这是我收到的第一行。 “2015 08 18 1708 57252 61680 0 2.6 45”

而不是尝试按选项卡拆分此行。

    fields = line.split("\t");

创建一个包含每个字段长度的数组,并使用 substring 方法拆分它。

这是解析返回数据的完整代码。它给出 119 行或其中 6-7 行有状态!=0(因此被跳过)。您的变量每个都有 112 个条目。

    res.on('data', function (chunk) {
    var fieldLengths = [0, 4, 7, 10, 16, 24, 32, 37, 48, 59, 72];

    //   console.log('BODY: ' + chunk);
    results += chunk.toString();
    //split results into an array by each new line
    lines = results.split("\n");

    // for me, the first "chunk" is incomplete.  Throw it away and just use the second chunk.
    if (lines.length <= 20) {
        return;
    }

    //delete header lines
    lines.splice(0, 18);

    for (var line in lines) {
        console.log("entry: " + lines[line]);
        //split into data fields
        var lineText = lines[line];
        var fields = [];
        for (var i = 0; i <= fieldLengths.length -1; i++) {
            fields.push(lineText.substring(fieldLengths[i], fieldLengths[i + 1]));
        }

        //if there are no problems (status code 0)
        //add the data to their respective fields
        if (fields[6] == 0) {
            year.push(fields[0]);
            month.push(fields[1]);
            day.push(fields[2]);
            time.push(fields[3]);
            statusno.push(fields[6]);
            proton.push(fields[7]);
            bulksp.push(fields[8]);
            iontemp.push(fields[9]);
        }
    }
});
res.on('end', function (e) {
    console.log(year);
});

});

如果您使用 Visual Studio(免费社区版可以使用)并为 visual studio 添加 Node 工具,这很容易调试。

如果数据不太正确,请告诉我。我了解您正在尝试做什么,并且可以在必要时调整代码。

关于javascript - 在 node.js 中使用来自 HTTP 请求的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32080641/

相关文章:

javascript - DeprecationWarning process.EventEmitter 已弃用

node.js - Kubernetes 通过基于时间的触发器扩展 pod

http - 如何在 HTTP1.1 中进行标准的符合 GET 查询

node.js - 如何在 Node/Express 客户端中正确呈现服务器端错误?

javascript - window.history.back 非法调用

javascript - 具有可选择行和下拉列表的数据表

javascript - NodeJs + Mysql 链式多查询

javascript - 获取跨域客户端请求页面内容

Javascript 基本原型(prototype) - 无法更新属性

javascript - 在物化设计中设置自动播放轮播的间隔