在node.js中检索JSON数据时出错

时间:2017-08-03 04:00:39

标签: javascript json node.js

我正在尝试创建一个在我的AWS ec2实例上显示最高命令数据的Android应用程序。以下是我编写的node.js文件。它使用topparser npm模块发送top命令结果。并使用 checkCpuUsage 函数,如果cpu使用率超过1%,它会发送通知。

<div class="pagination">
    <ul id="pagination">
    </ul>
</div>

我在checkCpuUsage()函数中收到以下错误:

var express = require('express');
var app = express();
var fs = require('fs');
var spawn = require('child_process').spawn;
var topparser=require("topparser");
var FCM = require('fcm-node');
var server = app.listen(8080);
var regTokens = [];
var bodyParser = require('body-parser');
app.use(bodyParser.json());
let data_builder = "";
const DEFAUT_TOP_DURATION = 2000;



function getTopData(callback, duration) {

    duration = duration || DEFAUT_TOP_DURATION;

    var top = spawn('top');
    top.stdout.on('data', function(data) {
        data_builder+=data.toString();
    });

    setTimeout(function() {
        top.kill();
        callback(topparser.parse(data_builder,10))
    },duration);
}


function sendServerData(req, res) {

    getTopData((data)=>{
        res.status("200").send(data);
    })

}

function checkCpuUsage() {

    getTopData((data)=>{

        var idl = data.cpu.idle;

        if(idl<99) {
            sendNotification(idl);
        }

    }, 2000)

}


function saveRegToken(req, res) {
    console.log("saveRegToken req body", req.body)
    regTokens.push(req.body.token);
    res.send(200);
}

let server_key =JSON.parse(fs.readFileSync(('./config.json'))); ;

function sendNotification(idle){
    var idl = idle;
    var fcm = new FCM(server_key);
    for(i=0; i<regTokens.length; i++) {
        var message = {
            to: 'regTokens[i]',
            notification: {
                title: 'CPU Usage!',
                body: 'CPU Usage: ' + idl,
            },
        };

        fcm.send(message, function(err, response){
            if (err) {
                console.log("Something has gone wrong!");
            } else {
                console.log("Successfully sent with response: ", response);
            }
        });
    }
}

setInterval(()=>checkCpuUsage(),10000);

app.get('/sys', sendServerData);

app.post('/save_token', saveRegToken)

console.log("server listening on 8080");

以下是topparser模块的示例JSON结果:

var idl = data.cpu.idle;
                  ^

TypeError: Cannot read property 'cpu' of undefined
at getTopData (/home/ubuntu/server_monitor/server1.1.1.js:38:17)
at Timeout._onTimeout (/home/ubuntu/server_monitor/server1.1.1.js:26:3)
at ontimeout (timers.js:469:11)
at tryOnTimeout (timers.js:304:5)
at Timer.listOnTimeout (timers.js:264:5)

2 个答案:

答案 0 :(得分:0)

错误明确指向TypeError: Cannot read property 'cpu' of undefined

这意味着您的dataundefined。在这里,您无法从getTopData()获取数据。

您可以查看这两行data_builder+=data.toString();topparser.parse(data_builder,10)

添加一些控制台语句,您将明白这一点。

建议

在代码中保持一致。您正在某处编写纯JavaScript语法,并在ES6

中的某处

养成跟随任何人的习惯。

答案 1 :(得分:0)

问题在于:

var top = spawn('top');
top.stdout.on('data', function(data) {
    data_builder+=data.toString();
});

setTimeout(function() {
    top.kill();
    callback(topparser.parse(data_builder,10))
},duration);

您正尝试使用超时调用回调,这是不好的做法。相反,你从stdout.on('data')内部调用回调,因此确保在调用回调之前调用函数并且有数据可用。

像这样:

top.stdout.on('data', function(data) {
    data_builder+=data.toString();
    top.kill();
    callback(topparser.parse(data_builder,10))
});

理想情况下,使用promises将有助于使代码更具可读性和结构性。