如何使用 html 按钮执行节点功能
How to execute node function using html button
我是 nodejs 的新手,我想使用 node 写入串行端口,但现在我希望它由按钮触发。数据来自文本框。
当我在 console/terminal 中 运行 时,我的节点脚本运行良好。但是不能用网页中的按钮来做到这一点。
这是我嵌入 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
在此先感谢您的帮助。 :)
Node.js是一个宿主环境,可以执行JS,提供Node.js具体API。浏览器,是一个不同的托管环境,具有不同的 API。不能在浏览器中使用Node的特定API,使用NodeAPI的JS会导致浏览器报错
例如,您的脚本正在使用全局 require
函数,该函数在浏览器 API 中不可用。这就是为什么:
ReferenceError: require is not defined
相反,您的脚本也无法在 Node 上执行,因为它使用浏览器 API:
document.getElementById("textbox1")
您在一个脚本中混合了来自不同环境的 API。
但是,如果您的 JS 脚本不使用特定于 Node 或浏览器的 API,它可以在 Node 和浏览器中执行而不会出错。但是你的脚本不是这样。
您的问题的解决方案可以是将您的脚本拆分为两个单独的脚本,运行 一个在浏览器中,另一个在 Node.js 中,并使用 [=] 在它们之间交换数据13=].
NodeJS 是一个 non-browser JavaScript 环境。您不能在浏览器环境中使用大多数 NodeJS 功能,因为它们不是为此而设计的。
相反,您将有一个本地 NodeJS 进程提供 Web 端点(例如,Web 服务器;也许使用 Express,但您不必这样做)并且 运行 该 NodeJS 进程正在监听对于网络请求。然后,您的网页上会有一个按钮,可以 ajax 调用执行工作的 NodeJS 服务器。
当然,这只会让您在服务器进程 运行ning 所在的机器上执行工作。
也许从https://wzrd.in/standalone/serialport@latest
导入串口模块
另一方面,尝试将逻辑与视图分开,我不知道你的应用程序是否会增长或者它是否只是一个 POC,但使用 messageBroker 或套接字将你的动作视图与引擎绑定?
希望对您有所帮助
我是 nodejs 的新手,我想使用 node 写入串行端口,但现在我希望它由按钮触发。数据来自文本框。 当我在 console/terminal 中 运行 时,我的节点脚本运行良好。但是不能用网页中的按钮来做到这一点。 这是我嵌入 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
在此先感谢您的帮助。 :)
Node.js是一个宿主环境,可以执行JS,提供Node.js具体API。浏览器,是一个不同的托管环境,具有不同的 API。不能在浏览器中使用Node的特定API,使用NodeAPI的JS会导致浏览器报错
例如,您的脚本正在使用全局 require
函数,该函数在浏览器 API 中不可用。这就是为什么:
ReferenceError: require is not defined
相反,您的脚本也无法在 Node 上执行,因为它使用浏览器 API:
document.getElementById("textbox1")
您在一个脚本中混合了来自不同环境的 API。
但是,如果您的 JS 脚本不使用特定于 Node 或浏览器的 API,它可以在 Node 和浏览器中执行而不会出错。但是你的脚本不是这样。
您的问题的解决方案可以是将您的脚本拆分为两个单独的脚本,运行 一个在浏览器中,另一个在 Node.js 中,并使用 [=] 在它们之间交换数据13=].
NodeJS 是一个 non-browser JavaScript 环境。您不能在浏览器环境中使用大多数 NodeJS 功能,因为它们不是为此而设计的。
相反,您将有一个本地 NodeJS 进程提供 Web 端点(例如,Web 服务器;也许使用 Express,但您不必这样做)并且 运行 该 NodeJS 进程正在监听对于网络请求。然后,您的网页上会有一个按钮,可以 ajax 调用执行工作的 NodeJS 服务器。
当然,这只会让您在服务器进程 运行ning 所在的机器上执行工作。
也许从https://wzrd.in/standalone/serialport@latest
导入串口模块另一方面,尝试将逻辑与视图分开,我不知道你的应用程序是否会增长或者它是否只是一个 POC,但使用 messageBroker 或套接字将你的动作视图与引擎绑定?
希望对您有所帮助