【问题标题】:Event on.('event'.... never fired, why?事件 on.('event'.... 从未触发,为什么?
【发布时间】:2019-09-23 23:01:54
【问题描述】:

我正在使用 socket.io 进行协作任务,为此我使用事件。

在我的服务器 server.js 中有:

io.sockets.on('connection', function (socket) {
    console.log("socketon");
    socket.on('task', function(task){
        console.log("another task");
        task=ent.encode(task);
        socket.broadcast.emit('task', {task : task});
    })
});

在我看来,我有 shared.ejs 我有:

var socket = io.connect('http://localhost:8080/shared/');

socket.on('task', function (data) {
    printtask(data.task);
})

$('#addtask').submit(function () {
    let task = $('#task').val();
    socket.emit('task', task);
    printtask(task);
    $('#task').val('').focus();
    return false;
});

function printtask(task) {
    $('#todolistlist').prepend("<li> <a class='text-danger' href='#'>✘</a>" + task + '</li>');
}

当我转到页面 http://localhost:8080/shared/ 我在控制台“socketon”中时,套接字已安装并且工作正常但是当我点击我的提交时,我在控制台中没有“另一个任务”。
我不知道为什么我的事件“任务”没有被触发。
如果有人有想法,我会很高兴:)
PS:如果是减号,请告诉我原因,以便我可以升级我的帖子
编辑:
这里是 server.js 中传递的要求:

var express = require('express');
var app = express();
let server = require('http').createServer(app);
let ent = require('ent');
var session = require('cookie-session');
var bodyParser = require('body-parser');
let io = require('socket.io').listen(server);
var encodedUrl = bodyParser.urlencoded({ extended: false });

这里是不同的get(我的socket在/shared中使用):

.get('/', function(req, res) {
    res.render('index.ejs');
})
.get('/private/', function(req, res) {
    res.render('todolist.ejs', {todolist: req.session.todolist});
})
.post('/private/add/', encodedUrl, function(req, res) {
    if (req.body.addtodo !=''){
        req.session.todolist.push(req.body.addtodo);
    }
    res.redirect('/private/');
})
.get('/private/delete/:index', function(req, res) {
    if (req.param.index != '') {
        req.session.todolist.splice(req.params.index, 1);
    }
    res.redirect('/private/');
})
.get('/shared/', function (req, res) {
    res.render('shared.ejs');
  })
.use(function(req, res, next){
    res.redirect('/')
});

这里是我 shared.ejs 的 html 内容

<div class='container'>
                <div class= row>
                    <ul id="todolistlist" class="offset-lg-2 col-lg-8 list-group list-group-flush">
                    </ul>
                    <section class="offset-lg-1 col-lg-1">
                        <p>connected:</p>    
                        <ul id="todolistmembers" class="list-group list-group-flush">
                        </ul>
                    </section>
                </div>
                <form id='addtask' method='post' class="form-inline offset-lg-2 mb-3 col-lg-8 align-items-center">
                    <div class="input-group w-100" >
                        <div class="input-group-prepend">
                            <label id="basic-addon3" class="input-group-text" for="addtodo">What to do ?</label>
                        </div>
                        <input type="text" id="task" class="form-control" style="text-align:right" name="addtodo" id="addtodo" autofocus />
                        <span class="input-group-append">
                            <input type="submit" class="btn btn-primary" value="add"/>
                        </span>
                    </div>
                </form>
            </div>
            <script src="/js/jquery.min.js"></script>
            <script src="/socket.io/socket.io.js"></script>
            <script src="/js/bootstrap.min.js"></script>

【问题讨论】:

  • 您确定调用了“提交”处理程序吗?
  • 是的,区域文本是从 jQuery 添加的,奇怪的是,如果事件不存在但它存在(但重点是我在我的应用程序的页面上使用它)
  • 你为什么连接到'http://localhost:8080/shared/'而不是'http://localhost:8080'?您正在连接到名为 shared 的 socket.io 命名空间,因此您的事件将在服务器上仅显示到该命名空间。因此,除非您在该命名空间中的服务器上注册事件处理程序,否则您将看不到这些事件。
  • @jfriend00 谢谢你

标签: node.js socket.io


【解决方案1】:

连接到“http://localhost:8080/shared/”而不是“http://localhost:8080”是连接到名为 shared 的特定 socket.io 命名空间。因此,您的事件将仅在该名称空间的服务器上显示。因此,除非您在该命名空间中的服务器上注册事件处理程序或从连接 URL 中删除 /shared,否则您将看不到这些事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多