0

我是 nodejs 的新手,我想使用 node 写入串行端口,但现在我希望它由一个按钮触发。数据来自文本框。当我在控制台/终端中运行节点脚本时,它运行良好。但是不能用网页中的按钮来做到这一点。这是我嵌入在 html 中的 nodejs

<!DOCTYPE html>
<html>
<head>
    <title>Node x HTML</title>
</head>
<body>

    <script>
    function write_serial() 
    {
        var serialport = require("serialport");
        var SerialPort = serialport.SerialPort;

        var sp = new SerialPort("/dev/ttyACM0", {
          baudrate: 9600,
          parser: serialport.parsers.readline("\n")
        });

            var text = document.getElementById("textbox1").value;

            sp.on('open', function() 
            {
                sp.on('data', function (data) 
                {
                    sp.write(name);
                });
            });
    }

    </script>

    <Input Type = "text" id = "textbox1" >
    <BR>
    <br><button onclick="write_serial();" href="javascript:;">Go!</button>
</body>
</html>

这是我打开页面控制台时遇到的错误(F12)

ReferenceError: require is not defined

在此先感谢您的帮助。:)

4

3 回答 3

2

Node.js 是一个托管环境,可以执行 JS 并提供 Node.js 特定的 API。浏览器是一个不同的托管环境,具有不同的 API。你不能在浏览器中使用 Node 的特定 API,使用 Node API 的 JS 会导致浏览器出错。

例如,您的脚本正在使用全局require函数,该函数在浏览器 API 中不可用。这就是为什么:

ReferenceError:未定义要求

相反,您的脚本也不能在 Node 上执行,因为它使用浏览器 API:

document.getElementById("textbox1")

您已经在一个脚本中混合了来自不同环境的 API。

但是,如果您的 JS 脚本不使用 Node 或浏览器特定的 API,它可以在 Node 和浏览器中执行而不会出错。但您的脚本并非如此。

解决问题的方法是将脚本拆分为两个单独的脚本,一个在浏览器中运行,另一个在 Node.js 中运行,并使用XMLHttpRequest在它们之间交换数据。

于 2017-01-14T08:08:52.203 回答
1

NodeJS 是一个非浏览器的 JavaScript 环境。您不能在浏览器环境中使用大多数 NodeJS 功能,因为它们不是为它设计的。

相反,您将有一个本地 NodeJS 进程提供一个 Web 端点(例如,一个 Web 服务器;也许使用 Express,但您不必这样做)并运行该 NodeJS 进程,以便它监听 Web 请求。然后,您的网页上有一个按钮,该按钮对执行工作的 NodeJS 服务器进行 ajax 调用。

自然,这只允许您在运行服务器进程的机器上执行工作。

于 2017-01-14T08:09:14.373 回答
-1

也许从https://wzrd.in/standalone/serialport@latest导入串口模块

另一方面,尝试将逻辑与视图分离,我不知道您的应用程序是否会增长或者它是否只是一个 POC,但使用 messageBroker 或套接字将您的操作视图与引擎绑定?

希望能帮助到你

于 2017-01-14T08:16:39.287 回答