当前位置: 首页 > 知识库问答 >
问题:

从一个 id 发出的 socket.io

顾均
2023-03-14

我用socket.io通过nodejs和angular4编写了代码。我使用过2种不同的浏览器,我检查了连接和socket.io给了2个不同的socket.id,但是当发出2个浏览器时,却是从1个id发出的!

应用程序中的代码.js

io.on('connection', function(socket){app.set('socket', socket);console.log('a user connected to :'+socket.id);socket.on('disconnect', function(){console.log('user disconnected');});});

代码发出

        let socket     = req.app.get('socket');
        console.log('emit from :' +socket.id )
        socket.emit('chatroom-'+chat.room, chat);

客户端的代码侦听

        this.socket.on('chatroom-'+this.roomData._id, (data)=>{
          console.log('socket push',data);             
        })

我所有的代码

初始化app.js

//construct
const express       = require('express');
const app           = express();
const server        = require('http').createServer(app);
const io            = require('socket.io').listen(server);
const port          = 3000;

//initialize
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true}));
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(path.join(__dirname,'public')));
///passport strategy
require('./config/passport');

//routes
const chat    = require('./routes/chat');
app.use('/chat',chat);


io.on('connection', function (socket) {
    app.set('socket', socket);
    console.log('a user has connected as :'+socket.id);
    io.on('connection', function () {
        console.log('a user has disconnected ');
    });

});

//start server code
server.listen(port, ()=> {
    console.log('node serve has been started on port : '+port);
})

在chat.js路由添加新消息后发送聊天

///add new chat
router.post('/add', passport.authenticate('jwt',{session:false}), (req,res,next) => {
    //validation
    if(!req.user._id){ res.json({status:false, message:'something went wrong, please sign-in first and try again'}) }
    if(req.user._id != req.body.user){ res.json({status:false, message:'something went wrong, please sign-in first and try again'}) }
    if(!req.body.room){ res.json({status:false, message:'something went wrong, please refresh the page and try again'}) }
    if(!req.body.text){ res.json({status:false, message:'you have to fill a chat message to add it'}) }
    next();
}, (req, res) => {
    //create new one 
    let chatData = new Chat(req.body);

    //do create
    Chat.create(chatData, (err, chat)=>{
        //error 
        if(err){ res.josn({status:false, message:err.message})}
        else{
            //replace user id to user data
            chat.user = req.user;
            //define socketio
            let socket     = req.app.get('socket');
            //emit new message
            socket.broadcast.emit('chatroom-'+chat.room, chat);
            //return respone
            res.json({status:true, message:'the message has been sent', chat:chat})
        }
    })
});

共有1个答案

阙辰龙
2023-03-14

如果您只是尝试从您的路由广播到一个房间,您可以更改此选项:

io.on('connection', function (socket) {
    app.set('socket', socket);
    console.log('a user has connected as :'+socket.id);
    io.on('connection', function () {
        console.log('a user has disconnected ');
    });
});

对此:

// make io available via app object
app.set('io', io);

io.on('connection', function (socket) {
    console.log('a user has connected as :'+socket.id);
    io.on('disconnect', function () {
        console.log('a user has disconnected ');
    });
});

然后,改变这一点:

        let socket     = req.app.get('socket');
        //emit new message
        socket.broadcast.emit('chatroom-'+chat.room, chat);

对此:

        let io  = req.app.get('io');
        //emit new message
        io.emit('chatroom-'+chat.room, chat);

这将始终如一地将聊天发送给房间中的所有用户。

如果您只想发送给房间中的其他用户,而不是发送给发出消息的用户,那么通过套接字发送消息会更容易。io,而不是通过表单帖子。然后,您可以使用:

 socket.broadcast.emit('chatroom-'+chat.room, chat);

其中socket是您在套接字上接收消息的套接字。io,你会很方便。

 类似资料:
  • 问题内容: 从最近6小时开始搜寻,但没有任何解决方法。请帮我。Elasticsearch ID为:2、4、7、8、11、15、15、16,.... 我的当前文档ID为11,然后如何获取下一个ID为15,上一个ID为8。 谢谢 问题答案: 您可以运行两个查询,一个查询下一个ID,一个查询前一个ID。 下一个ID的查询是: 而先前ID的查询为:

  • 我有一个API,让用户使用一些凭证登录,我正在开发另一个API,用来注册程序的日志。 基本上我想在我的方法上调用另一个api。 这是我现在拥有的代码,但我总是收到500个空错误: 这是我的控制器上的登录方法: 当用户尝试对自己进行身份验证时,此方法 this.redirectLogs 应将消息发送到我的日志 API,并从中创建日志。 这是方法: 日志 URL 是该方法在我的 loggerAPI 上

  • 我有以下名为的数据帧,我想将该数据帧子集为只有列有1和0的ID。下面的示例将删除=1,因为它只有1(而不是0)。 预期产出: 我怎么能这么做?我想一个团体会有帮助?但不确定如何正式地进行

  • 我有一个发出随机位/布尔值的可观察对象。我需要制作另一个可观察对象,它结合这些随机位来创建和发出随机整数。每次底层的可观察对象发出一个位时,这个可观察对象都会将该位附加到一个位字符串中,一旦该位字符串达到特定长度,这个可观察对象会将其转换为一个整数并发出它。 下面是我如何使用Android LiveData实现它的: 如何使用RxJava 2实现这一点?

  • 我有两张桌子。括号中的属性名和列名。 表Animal有字段:animalId(animalId)、name(name)、owner(owner_id)owner与owner对象和owner_id列是多对一关系 表所有者有字段:ownerId(owner_id),name 我想选择一个ID为5的动物的主人。冬眠怎么能做到呢?

  • 我的数据库中有两个表。一个表包含有关用户的信息,而另一个表包含有关预订的数据。当用户进行预订时,userid将被放置在预订表中。现在,我想展示一张用户的照片,其中包括预订的备注和日期,但是照片在users表中。 这是我的两张桌子: null null