Node.js Socket.io表示不同的路由
我正在尝试在最新的express版本上使用Socket.IO,但没有成功。 我想在特定的js文件上使用Socket.IO功能与“router”一起使用,而不是与“app.js”一起使用,后者是全局的 此外,我希望服务器端与客户端的页面不同 这是我的密码:Node.js Socket.io表示不同的路由,node.js,sockets,express,websocket,socket.io,Node.js,Sockets,Express,Websocket,Socket.io,我正在尝试在最新的express版本上使用Socket.IO,但没有成功。 我想在特定的js文件上使用Socket.IO功能与“router”一起使用,而不是与“app.js”一起使用,后者是全局的 此外,我希望服务器端与客户端的页面不同 这是我的密码: 服务器端,一个名为“addPost.js”的文件,位于“routes”文件夹中: 客户端,一个名为“index.ejs”的文件,位于“views”文件夹中,它与“addPost.js”不相关: var socket=io.connect('
var socket=io.connect('http://localhost:3000/');
socket.on('news',函数(数据){
控制台日志(数据);
emit('my other event',{my:'data'});
});
如何在它们之间连接???您需要使套接字侦听服务器端口。在addPost.js中类似的smth:
<script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script>
var socket = io.connect('http://localhost:3000/');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
function listenServer(){
io = require('socket.io').listen(server)
}
如果您不想在应用程序文件中执行此操作,则应将指向服务器的链接发送到套接字。在你的app.js中类似这样的内容:
var server = http.createServer(app);
server.listen(app.get('port'), function(){
log.info('Express server listening on port ' + app.get('port'));
});
var socket = require('addPost.js');
socket.listenServer(server);
您需要使套接字侦听服务器的端口。在addPost.js中类似的smth:
<script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script>
var socket = io.connect('http://localhost:3000/');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
function listenServer(){
io = require('socket.io').listen(server)
}
如果您不想在应用程序文件中执行此操作,则应将指向服务器的链接发送到套接字。在你的app.js中类似这样的内容:
var server = http.createServer(app);
server.listen(app.get('port'), function(){
log.info('Express server listening on port ' + app.get('port'));
});
var socket = require('addPost.js');
socket.listenServer(server);
您不需要在路由器内部安装io 就这么做吧
router.get('/', function(req, res, next) {
res.render('addPost');
// after you render the page
// client will connect to socket
// or if you want to send news along with this request do something like
getNews(function(err, news){
res.render('addPost', {news: news});
// obviously you need to render the news in your view
});
});
io.on('connection', function (socket) {
// now after the client has recieved page from res.render
// client will connect and can ask for news
socket.on('getNews', function () {
// your logic to get news
getNews(function(err, news){
if(!err) socket.emit('news', news);
});
});
socket.on('my other event', function (data) {
console.log(data);
});
});
在客户端脚本中
<script>
var socket = io.connect('http://localhost:3000/');
//ask for news
socket.emit('getNews');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
var socket=io.connect('http://localhost:3000/');
//询问消息
emit('getNews');
socket.on('news',函数(数据){
控制台日志(数据);
emit('my other event',{my:'data'});
});
希望有帮助。您不需要在路由器内部安装io 就这么做吧
router.get('/', function(req, res, next) {
res.render('addPost');
// after you render the page
// client will connect to socket
// or if you want to send news along with this request do something like
getNews(function(err, news){
res.render('addPost', {news: news});
// obviously you need to render the news in your view
});
});
io.on('connection', function (socket) {
// now after the client has recieved page from res.render
// client will connect and can ask for news
socket.on('getNews', function () {
// your logic to get news
getNews(function(err, news){
if(!err) socket.emit('news', news);
});
});
socket.on('my other event', function (data) {
console.log(data);
});
});
在客户端脚本中
<script>
var socket = io.connect('http://localhost:3000/');
//ask for news
socket.emit('getNews');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
var socket=io.connect('http://localhost:3000/');
//询问消息
emit('getNews');
socket.on('news',函数(数据){
控制台日志(数据);
emit('my other event',{my:'data'});
});
希望能有所帮助。将io.on('connection')…放在路由器内。get…没有意义。io.on(…)只需要运行一次,每次有人点击你的路由时你都要运行。你应该将套接字逻辑和路由器分开,因为它们不相关,尽管它们可能使用相同的数据。@Molda,你能详细说明你的评论吗?特别是,将套接字逻辑和路由器分开吗?我遇到了类似的问题,我不知道如何访问在server.js中设置连接后,其他路由上的套接字。理想情况下,应该有一个res.socket对象向客户端发送事件,但我还没有找到这样的功能。@JonathanKempf检查我的回答放置io.on('connection')…在router.get…内没有意义。io.on(…)只需要运行一次,每次有人点击你的路由时你都要运行。你应该将套接字逻辑和路由器分开,因为它们不相关,尽管它们可能使用相同的数据。@Molda,你能详细说明你的评论吗?特别是,将套接字逻辑和路由器分开吗?我遇到了类似的问题,我不知道如何访问在server.js中设置连接后,其他路由上的套接字。理想情况下,应该有一个res.socket对象向客户端发送事件,但我还没有找到这样的功能。@JonathanKempf检查我的答案