使用node.js中的HTTP请求中的数据

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

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"); 

创build每个字段长度的数组,并使用子string方法拆分它。

以下是parsing返回数据的完整代码。 它给出119行或6-7有一个状态!= 0(所以被跳过)。 你的variables每个都有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添加节点工具,则这很容易debugging。

让我知道数据是不是很正确。 我明白你想要做什么,如有必要可以调整代码。

 function callback() { for (var line in lines) { //split into data fields year.push(lines[line].substring(x,y));//fill in x and y //month.push.. //day.push.. } } 

要么

 callback() { var x = []; for (var line in lines){ x = lines[line].split(" "); console.log(x); year.push(x[index]) // index being where year was split into x } } 

只要把这个函数放在res.on('end')里。 我不完全确定你在做什么,希望这有助于。

编辑:

  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); }); 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(" "); //console.log(x); Print x and see which index of x has the vaule you want. Constant for all year.push(x[0]); month.push(x[1]); day.push(x[2]); time.push(x[4]); } //console.log(year,month,day,time); Check final result }