我正在使用快递js& socket.io来构建我的简单应用程序。
所以,有一个使用PHP的网站“a”会将一些数据发布到我的应用程序(使用express js构建)。 app.js中定义了2条路线,它们是:
我在这里做的是:
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,所以我尽量通过参考一些相关的教程来实现它,但它仍然没有用。
有没有正确的方法呢?
提前致谢
答案 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,限制自己使用命名空间。
您的问题有两个解决方案:
根本不使用名称空间:
io.of('/voting_result').emit('getResult', {votingResult : result.data});
变为
io.emit('getResult', {votingResult : result.data});
在客户端上定义一个名称空间,您将在服务器端使用该名称空间:
var socket = io.connect('/voting_result');