从浏览器中调用Node.js方法(使用Express)

11

我在app.js中定义了这三个路由。

app.use('/', require('./routes/index'));
app.use('/LEDon', require('./routes/LEDon'));
app.use('/LEDoff', require('./routes/LEDoff'));

在我的路由文件中,我有以下内容:

var express = require('express');
var router = express.Router();
var Gpio = require('onoff').Gpio,
    led = new Gpio(17, 'out');

router.get('/', function(req, res, next) {
  led.writeSync(1);
});

module.exports = router;
所以当我进入/LEDon页面时,该方法运行并且一切都正常。但是,有没有可能在不使用GET请求的情况下运行该方法?我的主要目标仅是单击超链接,然后运行该方法。
3个回答

15

实质上,您正在要求客户端脚本直接调用Node服务器脚本中的函数。 除了Ajax POST之外,我所知道的唯一选择是Socket.io

这个类似的stackoverflow问题应该能帮到您。


编辑:我制作了一个跨多个文件的简单示例:

/test/app.js:

var express = require('express');
var app = express();

app.post('/LEDon', function(req, res) {
    console.log('LEDon button pressed!');
    // Run your LED toggling code here
});

app.listen(1337);

/测试/客户端.js

$('#ledon-button').click(function() {
    $.ajax({
        type: 'POST',
        url: 'http://localhost:1337/LEDon'
    });
});

/test/view.html

<!DOCTYPE html>
<head>
</head>

<body>
    <button id='ledon-button'>LED on</button>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script src='clientside.js'></script>
</body>

运行程序:在终端中输入node app.js,然后在你的浏览器中打开view.html。尝试点击按钮并查看终端输出。希望这能帮到你。


你能否向我展示如何在点击超链接时使用Socket.io?我之前一直在研究Socket.io,但就是想不明白。 - user2255273
抱歉,我不熟悉Socket.io。使用$.ajax可能会更容易。另一个答案提供了一个很好的Ajax解决方案。 - Keith Yong
谢谢!我最终使用了 socket.io,效果很好。所以感谢您指导我朝着正确的方向前进。 - user2255273
2
这对我有用!我正在制作一个远程控制机器人,并且已经在一个UDP端口上监听遥控指令(最终通过串口发送给iRobot Create)。所以,通过这个方法,我能够在我的网页上放置W A S D键,并调用服务器端的node.js函数向命令服务器发送UDP消息!谢谢! - Josh P
无法在Windows服务器上使其工作。View.html显示“无法获取/view.htm”。 - user525504

1

为解决您的问题,您可以使用 ajax 请求,例如:

<body>
    <a onClick=LEDon>LED On</a>
    <a onClick=LEDoff>LED Off</a>

    <script>
    function LEDon(){
       $.ajax({
          url: "http://yourDomain.com/LEDon"
       });
    }

    function LEDoff(){
       $.ajax({
          url: "http://yourDomain.com/LEDoff"
       });
    } 

    </script>
<body>

0

老问题 - 我知道。但随着时间的推移,新的方法出现了。

我可以建议尝试 api-mount。它基本上允许调用 API 作为简单的函数,而无需考虑 AJAX 请求、fetch、express 等等。在服务器端,你只需要:

const ApiMount = apiMountFactory()
ApiMount.exposeApi(api)

"

“api”基本上是一个方法/函数的对象,您可以从Web应用程序中调用它们。

在Web应用程序中,您可以这样做:

"
const api = mountApi({baseUrl: 'http://your-server.com:3000'})

完成这些步骤后,您可以像这样简单地调用您的API:

const result = await api.yourApiMethod()

试一下,希望能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接