【问题标题】:Using socket.io with express 4 and jade template将socket.io与express 4和jade模板一起使用
【发布时间】:2015-11-02 19:49:10
【问题描述】:

我正在尝试将 socket.io 与 express 一起使用,但我无法使其工作

这是我的文件:

roo:/app.js

var express = require('express');
var session = require('express-session');
var path = require('path');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

//Routes files
var maketurn = require('./routes/maketurn');

var app = express();
var io = require('socket.io').listen(app.listen(3000));

// view engine setupe
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');


app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));


app.use('/maketurn', maketurn);
module.exports = app;

这是我的控制器(路由器)

roo:/routes/maketurn.js

var express = require('express');
var router = express.Router();
var socketio = require('socket.io');

var app = express();
var server = app.listen(8088, function () {
    console.log("Express server listening on port and socket " + 3000);
});

var io = socketio.listen(server);

router
    .get('/', function (req, res) {
        io.on('connection', function (socket) {
            console.log('conectado el pendejo');
            socket.emit('news', {hello: 'world'});
            socket.on('my other event', function (data) {
            });
        });
        res.render('turns/maketurn', {title: 'Make Turn'});
    })

module.exports = router;

这是我的模板(客户端):

根:views/turns/maketurn.jade

extends ../layouts/turns

block content

    script.
        var socket = io.connect('httt://localhost:8088/maketurn');

        socket.on('news', function (data) {
            console.log(data);
            socket.emit('my other event', {my: 'data'});
        });
        socket.on('connection', function (data) {
            console.log(data);
            socket.emit('my other event', {my: 'data'});
        });

    .container
        form(method='post' action='#' role='form' id='turn')
            .wsn-form-control
                label Nombre y apellido
                input(name='name' type='text' id='name')

【问题讨论】:

  • “不能让它工作”告诉我们什么。究竟发生了什么/没有发生什么?
  • 您创建了两个独立的app 变量并尝试在不同的端口上启动两个Web 服务器和两个socket.io 侦听器。这真的是你想要的吗?
  • 大家好,我想启动一个公正的监听器,并在各种视图或视图控制器中使用它。

标签: node.js express socket.io pug


【解决方案1】:

您必须将套接字事件处理程序移到路由器之外,请查看我几个小时前写给有相同问题的用户的这个答案:

Socket.io node.js, how to log connection times avoid or account for page refresh/multiple sockets?

还有来自 Socket.io 网站的示例,它显示了相同的内容:

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

【讨论】:

  • 谢谢!但我不能在路由上使用套接字吗?
  • 您可以将您的套接字/用户存储在一个数组中并在路由处理程序中使用它们,但是 io.on('connection'... 需要在路由器之外,所以它不会得到每次有人到达路线时调用
  • 谢谢 xShirase 你能举一些关于在路由中使用套接字的例子吗?
  • 这需要另一个问题,在您尝试自己弄清楚之后;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 2018-06-02
  • 2012-12-13
  • 2012-07-20
  • 1970-01-01
  • 2015-02-28
相关资源
最近更新 更多