我正在尝试创建一个在我的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)
答案 0 :(得分:0)
错误明确指向TypeError: Cannot read property 'cpu' of undefined
这意味着您的data
是undefined
。在这里,您无法从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将有助于使代码更具可读性和结构性。