我试图通过使用passport.socketio将socket.io连接到passport.js来记录登录用户的用户名。它是成功的,但它记录了两次用户名,在尝试和搜索相当长的时间后,我被卡住了。
代码部分如下:
服务器代码:
public class BusinessClass : IBusinessClass
{
private readonly IDataClass _dataClass;
public BusinessClass(IDataClass dataClass)
{
_dataClass = dataClass;
}
public void DoSomething()
{
_dataClass.DoSomethingWithData();
}
}
客户代码
var server = http.createServer(app);
var io = require('socket.io')(server);
io.use(passportSocketIo.authorize({
cookieParser: cookieParser, // the same middleware you registred in express
key: 'connect.sid', // the name of the cookie where express stores its session_id
secret: 'hello', // the session_secret to parse the cookie
store: new (require("connect-mongo")(Esession))({
url: "mongodb://localhost/local"
}), // we NEED to use a sessionstore. no memorystore please
success: onAuthorizeSuccess, // *optional* callback on success - read more below
fail: onAuthorizeFail, // *optional* callback on fail/error - read more below
}));
function onAuthorizeSuccess(data, accept){
console.log('successful connection to socket.io');
accept(null, true);
accept();
}
function onAuthorizeFail(data, message, error, accept){
if(error)
throw new Error(message);
console.log('failed connection to socket.io:', message);
// We use this callback to log all of our failed connections.
accept(null, false);
// OR
// If you use socket.io@1.X the callback looks different
// If you don't want to accept the connection
if(error)
accept(new Error(message));
// this error will be sent to the user as a special error-package
// see: http://socket.io/docs/client-api/#socket > error-object
}
io.on('connection', function(socket) {
var userID = socket.request.user;
console.log(userID.tg+ " has connected")
});
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
server.listen(port);
输出如下:
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect();
</script>
我不确定为什么输出两次任何帮助都会非常感激。我对Node.js比较陌生,但我不相信它是造成它的护照部分,但是我被困住了所以我可能没有最好的想法。
感谢高级
编辑: 尝试了最新版本的socket并检查了我自己的版本,似乎都是最新版本,只是为了确保我将客户端代码更新为:
successful connection to socket.io
UserName has connected
UserName has connected
问题仍然存在
答案 0 :(得分:3)
我发现问题,我猜是我自己的愚蠢,
成功授权后,我接受了两次连接。因此它正在记录两次校正应该是:
function onAuthorizeSuccess(data, accept){
console.log('successful connection to socket.io');
//accept(null, true); -> remove this line
accept();
}
答案 1 :(得分:1)
这显然是以前版本中的错误。你可能只需要升级。看看下面的问题。 https://github.com/Automattic/socket.io/issues/350
将来,如果您正在尝试调试此类问题,那么熟悉Node Events Class Documentation会很有用。 io
只是一个事件监听器,这里发生的事情是 SOME 导致connection
事件正在执行双重任务。
可能是一些 Socket.io 代码多次触发emit('connection')
。
当我调试这样的东西时,调用emitter.listeners('event')
会很有用,因为它会告诉我谁,更重要的是有多少听众在听。
因此,在您的情况下,io.listeners('connection');
将为您提供一系列正在收听该事件的人。显然,io
正在注册它两次,但你可以找到这个技巧的位置。
另外,进入软件包本身并为emit('connection');
进行grepping会显示出那个令人讨厌的错误。