我在帖子请求中包裹了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);
}
});
});
});
答案 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()
。没有事件处理程序在另一个事件处理程序中设置。