期望的行为
我目前通过 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/