socket.emit没有在post请求中触发

时间:2016-08-11 03:00:04

标签: node.js socket.io

我在帖子请求中包裹了io.on('connection', function (socket) {。然后我在帖子请求中调用socket.emit('news', 'username taken');。出于某种原因,当我进行此调用时,它不向客户端发送任何内容。当我将emit更改为io.emit('connection', function (socket))时,它可以工作并将数据发送到客户端。我的解决方案的问题是使用io.emit会将数据发送到所有连接的套接字。我的问题是如何在此帖子请求中使用socket.emit。

io.on('connection', onConnection);

function onConnection(sock) {
 sock.emit('news', 'username is taken');
}

app.post('/signup', function(req, res) {

    var userDetails = User({
        firstname: req.body.firstname,
        username: req.body.username,
        email: req.body.email,
        password: bcrypt.hashSync(req.body.password1, bcrypt.genSaltSync(10))
    });

    User.findOne({
        $or: [ { 'username': req.body.username}, {'email': req.body.email}]
    }, function(err, user) {
        if (user) {
              if(user.username === req.body.username){
              onConnection();
              console.log('username is taken');
            } else {
            }
            if(user.email === req.body.email){
              console.log('email is taken')
            } else {
            }
        } else {
          userDetails.save(function(err) {
            if (err) throw err;
          });
          res.redirect('/');
          console.log('change to login')
        }
        if (err) {
            return done(err);
        }
    });

   });

});

2 个答案:

答案 0 :(得分:0)

我刚解决了我的问题。我所做的是创建一个名为socket1的变量。然后我将socket参数分配给io.on annonymous函数中的socket1。然后我将套接字作为通用变量,我可以在我的代码中随处调用。我不确定这是否在程序上是正确的,但它确实有效。

var SOCKET_LIST = {};

var socket1;

io.on('connection', function (socket) {
    SOCKET_LIST[socket.id] = socket;
    socket1 = socket;
    socket.emit('news', 'username taken');
});

app.post('/signup', function(req, res) {

var userDetails = User({
    firstname: req.body.firstname,
    username: req.body.username,
    email: req.body.email,
    password: bcrypt.hashSync(req.body.password1, bcrypt.genSaltSync(10))
});

User.findOne({
    $or: [ { 'username': req.body.username}, {'email': req.body.email}]
}, function(err, user) {
    if (user) {
        if(user.username === req.body.username){
          socket1.emit('news', 'username taken');
          console.log('username is taken');
        } else {
        }
        if(user.email === req.body.email){
          io.emit('news', 'email taken');
          console.log('email is taken')
        } else {
        }
    } else {
      userDetails.save(function(err) {
        if (err) throw err;
      });
      res.redirect('/');
      console.log('change to login')
    }
    if (err) {
        return done(err);
    }
});

});

答案 1 :(得分:0)

通常的方法是使用会话中间件,在加载网站上的第一页时建立用户会话。然后,当用户使用socket.io连接时,您可以将socket.id放入该用户的会话中。然后,当您获得app.post()并且想要发送到他们的socket.io连接时,您将查看该用户的会话,获取该用户的socket.id然后使用查找套接字那。一旦有了套接字,就可以向它们发送消息。

您使用会话连接socket.io连接和app.post()。没有事件处理程序在另一个事件处理程序中设置。