在我目前的项目中,我们有一个HTML页面。在HTML页面中,我们有几个按钮,例如我们有温度传感器,湿度传感器,报警等按钮。当我们点击按钮而不是后端时,它将运行相应的Node.js文件,例如当我们点击时温度传感器按钮比它运行的TemperatureSensor.js文件位于同一路径。 HTML页面的代码如下所示:
TemperatureSensor.js的代码如下:
var mqtt = require('mqtt');
var client = mqtt.connect('mqtt://test.mosquitto.org:1883');
var NUM_SAMPLE_FOR_AVG = 5;
var numSample = 0;
var tempCelcius = 0;
var currentAvg = 0;
client.subscribe('tempMeasurement');
client.on('message', function(topic, payload) {
if (topic.toString() == "tempMeasurement") {
sensorMeasurement = JSON.parse(payload);
console.log("tempValue is " + sensorMeasurement.tempValue);
if (numSample <= NUM_SAMPLE_FOR_AVG) {
numSample = numSample + 1;
if (sensorMeasurement.unitOfMeasurement == 'F') {
tempCelcius = ((sensorMeasurement.tempValue - 32) * (5 / 9));
} else {
tempCelcius = sensorMeasurement.tempValue;
}
currentAvg = parseFloat(currentAvg) + parseFloat(tempCelcius);
if (numSample == NUM_SAMPLE_FOR_AVG) {
currentAvg = currentAvg / NUM_SAMPLE_FOR_AVG;
var avgTemp = {
"tempValue" : parseFloat(currentAvg),
"unitOfMeasurement" : sensorMeasurement.unitOfMeasurement
};
client.publish('roomAvgTempMeasurement', JSON
.stringify(avgTemp));
console.log("Publishing Data roomAvgTempMeasurement ");
numSample = 0;
currentAvg = 0;
}
}
}
});
问题是当我们点击浏览器中的TemperatureSensor按钮而不是显示错误时: TemperatureSensor.js:1未捕获的ReferenceError:未定义require 。如果TemeperatureSensor的内容是console.log("Hello")
而不是在浏览器的控制台中显示Hello
。如何提供依赖?如果我们想要运行TemperatureSensor,HumiditySensor等,我们需要在终端中运行这些bcoz,例如,如果我们想运行TemperatureSensor而不是终端,我们必须编写{{1 }}。这需要更多的手动工作,因此为了减少这种努力,我们需要这种类型的HTML页面。如何解决这个问题??
答案 0 :(得分:2)
您无法在浏览器中运行Node.js代码,它们是完全独立的环境(例如,浏览器没有require
功能,因此您收到该错误的原因)。你最好的办法是研究创建某种REST服务(最有可能使用Express,Hapi或Restify),它允许你通过HTTP调用Node.js服务器。
This is a decent introduction to the topic - 它使用MongoDB进行数据持久化,但在制作这样的东西时,这绝不是必需的。在您的情况下,您基本上只需要为Temp和Humidity定义路由,运行代码以获取路由处理程序中的数据,然后将JSON数据发送回响应对象。然后,您就可以使用jQuery(或任意数量的其他库)向这些路由发出AJAX请求。
编辑:在查看MQTT GitHub页面之后,还有另一个选项 - 如果使用Browserify或Webpack等工具捆绑,则可以在浏览器中使用该库。鉴于学习编写和维护REST服务的复杂性,这可能是一个更好的选择。