【问题标题】:How to call node.js server side method from javascript?如何从 javascript 调用 node.js 服务器端方法?
【发布时间】:2020-07-03 18:28:54
【问题描述】:

我是 node.js 的新手,但我对 socketstream Web 框架有所了解,通过使用它我可以轻松地从 JavaScript 调用服务器端 node.js 方法。如果不使用该框架,我不知道如何做到这一点。如何从 JavaScript 调用 node.js 方法?

下面的代码是使用 socketstream 来调用服务器端的方法。所以我想在不使用这个框架的情况下调用相同的服务器端方法。

ss.rpc('FileName.methodName',function(res){ 
    alert(res);         
});

【问题讨论】:

  • Afaik(如果我错了,请纠正我),您不能直接从客户端调用服务器上的方法。但是,您可以通过附加方法名称向服务器发送某种请求,然后服务器可以调用它。
  • @Supericy :感谢您的回复,但我不知道如何直接调用。你能用代码解释一下吗?
  • 您需要公开一个端点供客户端请求。使用 express.js,可能类似于 app.get('/some.name', function(req, res) { // call code })。然后,您可以通过客户端上的 AJAX 调用访问该端点。

标签: javascript node.js


【解决方案1】:

我建议使用Socket.IO

服务器端代码

var io = require('socket.io').listen(80); // initiate socket.io server

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' }); // Send data to client

  // wait for the event raised by the client
  socket.on('my other event', function (data) {  
    console.log(data);
  });
});

和客户端

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost'); // connec to server
  socket.on('news', function (data) { // listen to news event raised by the server
    console.log(data);
    socket.emit('my other event', { my: 'data' }); // raise an event on the server
  });
</script>

或者,您可以使用路由器功能,该功能根据客户端的特定请求调用某些功能

var server = connect()
    .use(function (req, res, next) {
      var query;
      var url_parts = url.parse(req.url, true);
      query = url_parts.query;

      if (req.method == 'GET') {
        switch (url_parts.pathname) {
            case '/somepath':
            // do something
            call_some_fn()
            res.end();
            break;
          }
        }
    })
    .listen(8080);

并使用 JQuery 触发 AJAX 请求

$.ajax({
    type: 'get',
    url: '/somepath',
    success: function (data) {
        // use data
    }
})

【讨论】:

  • Socket.IO 如果不发送大量请求(OP 似乎表明),则可能会矫枉过正。
  • 同意,或者他可以使用connect 和路由器函数在客户端触发HTTP 请求时调用某些函数。
  • 我意识到这个帖子有点过时了,但是使用express 怎么样?作为var app = express();.....app.get('/dbquery',function(req,res){//do some db stuff....}); .....app.listen(2999,function(){...});,这将使服务在端口2999上进行侦听,并且对/dbquery服务的任何调用都将根据请求返回/执行某些操作。
【解决方案2】:

不是精确的套接字,而是一个简单的解决方案:

我可以建议尝试api-mount。它基本上允许将 API 作为简单函数调用,而无需考虑 AJAX 请求、获取、表达等。基本上在服务器中您可以这样做:

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

“api”基本上是您愿意从 Web 应用程序调用的方法/函数的对象。

然后在 Web 应用程序上执行以下操作:

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

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

const result = await api.yourApiMethod()

试试看。希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    相关资源
    最近更新 更多