我正在为我的beaglebone black编写一个程序,通过网页控制啤酒酿造过程的某些方面。我正在使用socket.io来保持通信的实时性。为此,我将套接字对象传递给位于硬件类中的操作。某些类(例如我的temp_sensor类)使用eventEmitter模式来允许其他对象订阅其数据。但是,当我使用temp_sensor的方法来订阅传入的套接字时,它告诉我对象(this)没有“on”方法。以下是我的代码:
module.exports = temp_sensor;
var fs = require("fs"),
exec = require("child_process").exec,
util = require("util"),
EventEmitter = require("events").EventEmitter;
var w1path = "/sys/bus/w1/devices/";
function temp_sensor(config){
// Put sensor verification code here//
this.name = config.name;
this.address = config.w1_address;
this.path = w1path + this.address + "/w1_slave";
this.value = null;
this.unit = config.unit;
this.emit_interval = 2000;
this.type = config.type;
this.subscribers = 0;
this.emitting = false;
this.prev_temp = null;
if (config.emit_interval){this.emit_interval = config.emit_interval;}
var self = this;
/*this.emit_data = setInterval(self.readSensor(function(temp) {
if (temp !== this.prev_temp) {
var timestamp = new Date().toJSON()
var data = {
"name": this.name,
"temp":temp,
"timestamp": timestamp
};
self.emit("temp_data", data);
this.prev_temp = temp;
};
}),this.emit_interval);*/
}
util.inherits(temp_sensor, EventEmitter);
temp_sensor.prototype.readSensor = function(callback){
var cmd = "cat " + this.path + " | grep t= | cut -f2 -d= | awk '{print $1/1000}'";
exec(cmd , function( error, stdout, stderr ) {
if (error) { callback(error); }
callback( Math.round((parseFloat(stdout) * 1.8 + 32) * 10) / 10 );
});
};
// component actions
temp_sensor.prototype.actions = [];
temp_sensor.prototype.actions["subscribe"] = function(socket) {
this.subscribers++;
this.on("temp_data",function(data) {
socket.emit("temp_sensor",data);
});
};
temp_sensor.prototype.actions["unsubscribe"] = function(socket) {
this.subscribers--;
// remove listener
};
我收到此错误:
/var/lib/cloud9/brewbone/lib/temp_sensor.js:64 this.on(“temp_data”,function(data){ ^ TypeError:对象没有'on'方法 在Array.temp_sensor.actions.subscribe(/var/lib/cloud9/brewbone/lib/temp_sensor.js:64:7)
非常感谢任何帮助!
答案 0 :(得分:1)
您正在做的是在* temp_sensor *中继承 EventEmitter 。 on 上的方法实际上可以在* temp_sensor *的原型中使用。但是后来你创建了另一个拥有自己原型的对象 - actions [“subscribe”] 。那么,这个在这里:
temp_sensor.prototype.actions["subscribe"] = function(socket) {
this.subscribers++;
this.on("temp_data",function(data) {
socket.emit("temp_sensor",data);
});
};
指向别的东西。
我建议保留原型并尝试实施revealing module pattern。