【问题标题】:Run Node.js file on button click event在按钮单击事件上运行 Node.js 文件
【发布时间】:2016-03-18 18:47:17
【问题描述】:

在我当前的项目中,我们有一个 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 Uncaught ReferenceError: require is not defined。如果 TemperatureSensor 的内容是console.log("Hello"),则它会在浏览器的控制台中显示Hello。如何提供依赖??为什么我们需要在终端运行温度传感器、湿度传感器等而不是在终端中运行它们,例如,如果我们想在终端中运行温度传感器,我们必须写sudo node TempeatureSensor.js .这需要更多的手动工作,因此为了减少这项工作,我们需要这种 HTML 页面。关于问题如何解决??

【问题讨论】:

    标签: javascript html node.js


    【解决方案1】:

    您不能在浏览器中运行 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 服务的复杂性,这可能是一个更好的选择。

    【讨论】:

    • 我可以运行带有内容的 Node.js 文件 console.log("Hello");在这种情况下,它会向浏览器的控制台显示 Hello。请提供更多信息和一些例子吗?我会很感激的。
    • @Saurabh13: This is a decent introduction to the topic - 它使用 MongoDB 进行数据持久化,但这绝不是制作此类东西的必要条件。在您的情况下,您基本上只需为 TempHumidity 定义一个路由,运行您的代码以获取路由处理程序中的数据,然后将 JSON 数据发送回响应对象。然后,您就可以使用 jQuery(或任何数量的其他库)向这些路由发出 AJAX 请求。
    • @Saurabh13:console.log 与 Node 无关,它只是普通的 JavaScript,因此您的浏览器可以正常运行。当您开始尝试导入包时,情况开始有所不同。
    • 感谢您提供的信息。其实我也不是很清楚。我可以使用 jQuery 向 Node.js 文件发出 AJAX 请求吗??
    • @Saurabh13:您可以使用 jQuery 向任何 REST 服务发出 AJAX 请求,它不是特定于 Node.js 的。 Express 将允许您创建一个 Node.js 文件,该文件将运行一个服务器并可以响应这些 AJAX 请求。
    最近更新 更多