Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用;插座;(非“io”)在快速路线中_Node.js_Express_Socket.io - Fatal编程技术网

Node.js 使用;插座;(非“io”)在快速路线中

Node.js 使用;插座;(非“io”)在快速路线中,node.js,express,socket.io,Node.js,Express,Socket.io,我对io.emit()和socket.emit()之间区别的理解是,io发送到所有连接的客户端,而socket.emit()只发送到连接的客户端 我见过express的模式,您可以将io实例绑定到响应,然后在路由处理程序中使用它 const io = require('./socket/index')(server); app.use((req, res, next) => { res.io = io; next(); }); 如何将“套接字”附加到请求/响应对象,以便

我对
io.emit()
socket.emit()
之间区别的理解是,io发送到所有连接的客户端,而
socket.emit()
只发送到连接的客户端

我见过express的模式,您可以将
io
实例绑定到响应,然后在路由处理程序中使用它

const io = require('./socket/index')(server);

app.use((req, res, next) => {
    res.io = io;
    next();
});
如何将“套接字”附加到请求/响应对象,以便仅向连接的客户端发送事件

例如:

app.use((req, res, next) => {

    io.on('connection', (socket) => {
        res.socket = socket;
    });

    next();
});

app.post('/upload', (req, res) => {
    // emits only to the client in question
    res.socket.emit('upload started');
})

您需要保留套接字id

// client
const socket = io.connect($constants.socketUrl,{        
    reconnection:true
});
socket.io将返回一个socket会话,其中包括一个id

const clientId = socket.id
您需要将该id保存在某个位置(本地存储、cookies等…。
然后在您的服务器中,您需要提供该id才能将消息发送到该特定客户端。
socket.io保留已连接客户端的列表,只要使用它即可。

//server, maybe you would need to add --> const socketId = "/#" + socketId
//Here is where you use io you passed previously.
io.sockets.connected[socketId].send(msg);

您需要保留套接字id

// client
const socket = io.connect($constants.socketUrl,{        
    reconnection:true
});
socket.io将返回一个socket会话,其中包括一个id

const clientId = socket.id
您需要将该id保存在某个位置(本地存储、cookies等…。
然后在您的服务器中,您需要提供该id才能将消息发送到该特定客户端。
socket.io保留已连接客户端的列表,只要使用它即可。

//server, maybe you would need to add --> const socketId = "/#" + socketId
//Here is where you use io you passed previously.
io.sockets.connected[socketId].send(msg);

如果您正在var app=express()下的app.js中使用express generator;添加以下行

 var server = require('http').Server(app);
 var io = require('socket.io')(server);
现在在app.js的末尾,您将看到module.exports=app;换成

module.exports = {app: app, server: server};
接下来,在编辑器中打开bin/www。更改,var app=require(“../app”);进入

然后更改var server=http.createServer(app);进入

打开app.js备份并添加此middlewear

app.use(function(req, res, next){
 res.io = io;
 next();
});
现在,您可以使用该代码进行发射

/* GET users listing. */
router.get('/', function(req, res, next) {
    res.io.emit("emit", "users");
    res.send('respond with a resource.');
});

如果您正在var app=express()下的app.js中使用express generator;添加以下行

 var server = require('http').Server(app);
 var io = require('socket.io')(server);
现在在app.js的末尾,您将看到module.exports=app;换成

module.exports = {app: app, server: server};
接下来,在编辑器中打开bin/www。更改,var app=require(“../app”);进入

然后更改var server=http.createServer(app);进入

打开app.js备份并添加此middlewear

app.use(function(req, res, next){
 res.io = io;
 next();
});
现在,您可以使用该代码进行发射

/* GET users listing. */
router.get('/', function(req, res, next) {
    res.io.emit("emit", "users");
    res.send('respond with a resource.');
});

我已经用socket.io和express生成器开发了一个完整的应用程序。请浏览我的博客文章,我也在我的文章中提供了指向我的存储库的链接


我已经用socket.io和express generator开发了一个完整的应用程序。请浏览我的博客文章,我也在我的文章中提供了指向我的存储库的链接


您必须在用户的套接字和来自同一用户的请求之间创建某种关联。通常,这是通过cookie或会话对象完成的,这样您就可以知道哪个套接字与哪个express会话关联。有一些软件包可以帮你完成这项工作。您需要一种方法将每个传入的http请求与某个用户ID或会话ID关联起来。然后,当他们连接socket.io连接时,您可以从传入的socket.io连接中使用相同的用户ID或sessionID,并以一种当http请求传入时可以关联的方式存储生成的套接字。我使用的不是express sessions,而是JWT令牌。我可以将套接字ID转储到服务器呈现HTML中吗?如果我这样做,那么如何使用套接字ID执行
socket.emit()
?在建立socket.io连接时是否显示JWT令牌?我没有看到你的任何JWT令牌代码,所以我不能说你是如何使用它的。express-session为你做了所有这些。如果您只想阅读有关cookie的内容,Express具有设置或获取cookie的功能。你可以在他们的文档中读到。这个秘密只是用来确保你的cookie是唯一的,与其他人的cookie不同,并检测篡改。如果您的Github存储库是私有的,那么您只需签入它,您的所有开发人员就可以访问您所有服务器的相同机密。有关更多信息,请参阅并阅读这两个答案。您必须在用户的套接字和来自同一用户的请求之间创建某种关联。通常,这是通过cookie或会话对象完成的,这样您就可以知道哪个套接字与哪个express会话关联。有一些软件包可以帮你完成这项工作。您需要一种方法将每个传入的http请求与某个用户ID或会话ID关联起来。然后,当他们连接socket.io连接时,您可以从传入的socket.io连接中使用相同的用户ID或sessionID,并以一种当http请求传入时可以关联的方式存储生成的套接字。我使用的不是express sessions,而是JWT令牌。我可以将套接字ID转储到服务器呈现HTML中吗?如果我这样做,那么如何使用套接字ID执行
socket.emit()
?在建立socket.io连接时是否显示JWT令牌?我没有看到你的任何JWT令牌代码,所以我不能说你是如何使用它的。express-session为你做了所有这些。如果您只想阅读有关cookie的内容,Express具有设置或获取cookie的功能。你可以在他们的文档中读到。这个秘密只是用来确保你的cookie是唯一的,与其他人的cookie不同,并检测篡改。如果您的Github存储库是私有的,那么您只需签入它,您的所有开发人员就可以访问您所有服务器的相同机密。有关更多信息,请参阅并阅读这两个答案。
socket.id
在客户端的何处可用?您说过,
socket.io
将“返回”一个套接字会话,并将其作为调用的结果返回给哪个调用?当您建立连接时,
const socket=io.connect
(示例中的第一部分)客户机中的
socket.id
在哪里可用?您说过,
socket.io
将“返回”一个套接字会话,作为哪个调用的结果返回它?当您建立连接时,
const socket=io.connect
(示例中的第一部分)