【发布时间】:2016-10-27 07:25:33
【问题描述】:
为了简化,我实际上有主页(/)和搜索页面(/search),在搜索页面中,我想使用socket.io向用户发送信息,因为我只想发送信息到一个套接字,我需要 io.on('connection' ...).
这是我的代码,无法正常工作。当我第一次进入 /search 时,一切正常,但是当我重新加载时,控制台会记录两次“消息 #2”。
控制台
First time
----------
Message #1
Message #2
Second time
----------
Message #1
Message #2
Message #1
Message #2
Message #2
server.js
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
app.set('view engine', 'ejs');
app.use( express.static( "public" ) );
app.get('/', function(req, res) {
res.render('index');
});
app.get('/search', function(req, res) {
res.render('search');
console.log('Message #1');
io.on('connection', function(socket) {
console.log('Message #2'); // Here's the problem
getSearch('something', function (err, data) {
if (err) {
console.log("ERROR : ", err);
} else {
socket.emit('fetchSearch', data);
}
});
});
});
server.listen('3000');
搜索
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="../favicon.png" rel="shortcut icon" type="image/x-icon">
<title>Title</title>
<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
</head>
<body>
<script>
var socket = io();
socket.on('fetchSearch', function(rows){
// Rows is an array
});
</script>
</body>
</html>
关于正在发生的事情或如何解决它的任何想法?
【问题讨论】:
-
好吧,让我们看看。事件处理程序运行一次,然后两次,然后是三次,所以......您必须多次将事件处理程序绑定到事件。您的代码似乎证实,每次调用 /search 都会向连接事件添加另一个处理程序。
-
你的意思是如果你导航到/search,你会看到
Message #1和Message #2,但是如果你刷新你只会看到Message #2? -
如何更改它才能正常工作? PD:我编辑了控制台日志
-
请发布“搜索”视图的前端代码。
-
你真的第二次收到 5 条消息?
标签: javascript node.js express socket.io