我可能犯了一个错误,但我无法在客户端捕获中间件错误,这是服务器代码:
(function () {
'use strict';
var url = require("url"),
sio = require('socket.io')(3010);
//Authentification required
sio.use(function (socket, next) {
return next(new Error('refused client'));
});
}());
和客户端代码:
(function () {
"use strict";
//Network
var socket = io.connect(SOCKET_IO_SERVER);
socket.on('error', function(){
console.error(arguments);
});
}());
那么它是一个错误吗?
编辑:在 chrome 上使用网络选项卡我确实看到了一个包含“拒绝客户端”的polling
请求
没有人?
我们无法运行您的示例。 更好的做法是提供一个失败的测试或一个 repo,其中包含一个我们可以运行以查看失败的示例。 这里有太多其他因素可能会影响这一点。
您采取了哪些步骤来调试您的问题?
+1
当错误作为参数传递给中间件上的下一个时,客户端不会调用错误回调。
编辑
我发现在使用命名空间时,中间件应该附加到命名空间:
var nsp = io.of('/namespace');
// client never receives the error event
io.use(function (socket, next) {
return next(new Error('refused client'));
});
// this way works
nsp.use(function (socket, next) {
return next(new Error('refused client'));
});
@oliveiragabriel07谢谢,这似乎是确切的问题,它的客户端实际上被拒绝了,但没有收到错误。
我创建了一个带有工作异常的小型仓库https://github.com/Korri/socket.io-issue688
我能够在带有“错误”事件处理程序的 socket.io 1.0 中捕获客户端中的中间件错误。
使用命名空间时我有同样的问题。 @oliveiragabriel07解决方案也对我有用,但我认为客户端应该能够接收到一般连接中间件(io.use)中抛出的错误我猜这是 socket.io 服务器问题
我同意@jbaez。
要捕获错误,您需要在 next() 之后返回。 我认为这也是 express.js 中的错误。
你应该有这样的:
io.use(function (socket, next) {
next(new Error('refused client'));
return;
});
这是不好的
io.use(function (socket, next) {
return next(new Error('refused client'));
});
最有用的评论
使用命名空间时我有同样的问题。 @oliveiragabriel07解决方案也对我有用,但我认为客户端应该能够接收到一般连接中间件(io.use)中抛出的错误我猜这是 socket.io 服务器问题