【发布时间】:2016-08-11 12:40:53
【问题描述】:
我将io.on('connection', function (socket) { 包裹在一个帖子请求中。然后我在帖子请求中调用socket.emit('news', 'username taken');。出于某种原因,当我进行此调用时,它不会向客户端发送任何内容。当我将发射更改为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);
}
});
});
});
【问题讨论】:
-
埃克。不要将
app.post()放入io.on()EVER。这是错误的。您的app.post()处理程序将可用于与该路由匹配的所有传入请求,并且您将为每个连接的单个用户添加一个新的重复处理程序,并且将为每个单个用户调用所有app.post()处理程序。没办法,这是永远正确的。 -
感谢您的澄清,我也想知道这一点。
-
我看到你改变了一些东西,但你也不能把
io.on('connection', ...)放在你的app.post()里面。这将为该事件创建重复的处理程序。回到开头,用文字准确描述您要解决的问题。 -
不,这也不起作用。请参阅我之前的评论。
-
请停止猜测代码。你不能在没有参数的情况下调用
onConnection()并期望它在你的最新版本中工作。请用文字准确描述您想要做什么,然后我们可以帮助您。如果目标是向发出app.post()请求的用户发送 socket.io 消息,那么请用文字描述一下,我们可以提供一些想法。