如何从不同/另一条路线发射?

时间:2013-12-04 13:32:14

标签: node.js express socket.io

我正在使用快递js& socket.io来构建我的简单应用程序。

所以,有一个使用PHP的网站“a”会将一些数据发布到我的应用程序(使用express js构建)。 app.js中定义了2条路线,它们是:

  • / send_voting_result - >将从网站“a”
  • 接收POST数据
  • / voting_result - >用户将访问&我想让它实时更新发布到/ send_voting_result的投票结果数据

我在这里做的是:

app.js

var app = require('express')()
  , server = require('http').createServer(app)
  , io = require('socket.io').listen(server);    

...

// Receive POST data and do update the data to /voting_result route
    app.post('/send_voting_result', function(req, res){
      var result = JSON.parse(req.body.kandidat);
      io.of('/voting_result').emit('getResult', {votingResult : result.data});
    });

app.get('/voting_result', function(req, res){
    res.render('voting_result', { title: 'Express', msg: 'This is Result page'});
});

voting_result.html

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect();
  socket.on('getResult', function (data) {
    console.log("Message from server : "+data);
  });
</script>

但是,此脚本中的“emit”进程似乎无效:

io.of('/voting_result').emit('getResult', {votingResult : result.data});

我无法在/ voting_result中检索发布到/ send_voting_result的数据

实际上,我是使用expressjs&amp;的新手。 socket.io,所以我尽量通过参考一些相关的教程来实现它,但它仍然没有用。

有没有正确的方法呢?

提前致谢

1 个答案:

答案 0 :(得分:2)

您使用的io.of()方法并未引用所访问网页的网址。它改为引用您在创建套接字时可以定义的命名空间:

// Client-side
var chat = io.connect('http://localhost/chat')
// Server-side
var chat = io
.of('/chat')
.on('connection', function (socket) { ... }) // will only apply to some connections

此功能用于在一个WebSocket上复用多个数据流,请参阅Socket.io's documentation限制自己使用命名空间

您的问题有两个解决方案:

  1. 根本不使用名称空间:

    io.of('/voting_result').emit('getResult', {votingResult : result.data});
    

    变为

    io.emit('getResult', {votingResult : result.data});
    
  2. 在客户端上定义一个名称空间,您将在服务器端使用该名称空间:

    var socket = io.connect('/voting_result');