jquery - 如何在 Express 路由处理程序中进行 socket.broadcast.emit?

标签 jquery node.js mongodb express socket.io

期望的行为

我目前通过 jQuery.ajax() 更新 Node/Express/MongoDB 应用程序要求。

服务器响应被发送回ajax请求的成功处理程序,并在发送者的客户端上进行各种界面更改。

客户端

function update_database(parameters) {

    $.ajax({
        method: "POST",
        url: "/api/v1/my_path",
        data: parameters,
        dataType: 'json',
        cache: false,
        headers: headers,
        success: function(results) {

            // perform interface changes

        },
        statusCode: {
            500: function() {

                console.log("that didn't work");

            }
        }
    });

}

当然,这只是更新发件人的客户端。

我想更新所有连接的客户端。

我尝试过的

official socket.io cheatsheet显示相关方法是:

// send to all clients except sender
socket.broadcast.emit('broadcast', 'hello friends!');

在上下文中,official tutorial广播部分显示:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

io.on('connection', function(socket){
  socket.broadcast.emit('hi');
});

问题

如何在路由处理程序的函数中socket.broadcast.emit

我需要将每个 broadcase.emit 包装在 io.on('connection') 回调函数中吗?

以下内容不起作用,因为变量 socket 尚未声明,但每次我想要 socket.broadcast.emit 时都必须使用 io.on('connection') 包装器,这似乎“不正确”。

服务器端

// app setup
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

// the route handler
app.route("/api/:api_version/my_path")
    .post(api_my_post);

// the function
const api_my_post = (req, res) => {

    // define the filter and update
    var filter = { _id: o_id };
    var update = { $set: { key: value } };

    // perform the required database update
    collection.findOneAndUpdate(filter, update, function(err, result) {
        if (err) {
            res.send(err);
        } else {

            // create an object to return
            var response_json = { key: value, key_2: value_2 };

            // return the object to the ajax success handler
            res.json(response_json);

            // return the object to all other connected clients
            socket.broadcast.emit("ajax_response", response_json);

        }
    });

}

编辑:

以下答案看起来很有希望并且相对简单,但似乎只适合 io.emit 场景,而不是 socket.broadcast.emit 场景。

是否可以以某种方式访问​​路由中的socket以允许使用socket.broadcast.emit?:

https://stackoverflow.com/a/31277123

基本配置:

var app = require('express')();
var server = app.listen(process.env.PORT || 3000);
var io = require('socket.io')(server);
// next line is the money
app.set('socketio', io);

内部路由或中间件:

exports.foo = function(req,res){
    // now use socket.io in your routes file
    var io = req.app.get('socketio');
    io.emit('hi!');
}

最佳答案

不,您只需实现一次套接字连接,并将套接字对象传递给 Controller ​​

样板代码

socket_object = require('./controllers/myapp/socket.js');
io.on('connection', function(socket) {
socket_object(socket);
});

socket.js 将具有类似的功能

module.exports = function(socket) {

socket.on('getevent', function(data) { 

});

关于jquery - 如何在 Express 路由处理程序中进行 socket.broadcast.emit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53238655/

相关文章:

android - 从 Android 应用程序发送到 Nodejs 服务器的编码问题,解码后是否有空格?

angularjs - Uncaught Error : [$injector:unpr] Unknown provider: storeProvider <- store | Auth0 - AngularJS

javascript - 如何让 browserify 的 "bundle"函数发出结束事件?

php - Symfony2 和 MongoDB : FormType of a document with references

mongodb - 使用日期聚合进行 Mongo 查询

javascript - 筛选具有多个值的表

javascript - 将 html 文件加载到页面后脚本不运行

jquery - 查找单击元素的同级元素

javascript - 使用node.js为mongodb添加时间戳

javascript - __doPostBack() 导致回发但不调用 aspx 页面中的按钮单击事件