Socket.io错误传递约定

背景:在Node中,通常在asynchronous调用中将错误对象传递给callback函数,以及由Joyent 在Node.js中的error handling中解释。 标准错误对象包含名称,消息,堆栈跟踪和可能的附加属性。 将string或普通对象传递或抛出为错误被认为是不好的做法。 使用Socket.io ,数据可以通过发送事件并具有可选的响应callback从客户端传输到服务器,反之亦然。 这打开了多种方式来传递和处理错误。

问题:如果来自客户端的socket.io事件在服务器上导致错误,那么通知客户端这个最好的做法是什么? 一个普通的错误对象的响应? 一个单独的错误事件和侦听器? 错误应该如何构造? 是否有像Node一样的最佳实践? 你在用什么?

例如:设想用于login的socket.io。 客户端通过发出如下所示的用户名和密码login:

socket.emit('login', {user: 'Foo', pass: 'Bar'}, function (response) { ... }); 

在成功login时,响应包含会话令牌。 但是,如果用户名或密码不匹配呢? 想到几种方法:

方法1 – 普通错误对象:响应可能包含一个属性error ,其中包含一个普通的类似错误的对象作为其值,标准名称和消息属性以及可能的附加属性:

 { error: { name: 'InvalidUsernameOrPasswordError', message: 'Username or password was invalid.', usernameExists: false } } 

客户端因此testing响应是否包含错误,如果不是,则继续login过程:

 socket.emit('login', {user: 'Foo', pass: 'Bar'}, function (response) { if (response.hasOwnProperty('error')) { // handle error } // do something with response.token }); 

方法2 – 简单string:类似于方法1,但是error属性只是一个表示错误名称的普通string。

 { error: 'InvalidUsernameOrPasswordError' } 

在这个简单的例子中,这种方法非常简单,但却缺乏传递有关错误的额外数据的能力。

方法3 – 单独的事件:服务器可以发射并且客户端监听附加事件来处理可能的结果:

 socket.on('loginError', function (error) { // handle error based on error.name and error.message }); socket.on('loginSuccess', function (data) { // handle successful login with data.token }); socket.emit('login', {user: 'Foo', pass: 'Bar'}); 

这种方法在事件发布模式下感觉是最明确和最纯粹的,但需要多个事件处理程序。

结论:似乎有很多可能的方式来传递和处理错误。 任何经验,想法或感觉?

这取决于你的“客户”。 如果最终用户像使用应用程序的人一样,那么他们真的不关心如何发送错误。 最后,你会在前端有一个文本,说他们错了。 所以你必须select你喜欢哪种方式来实现后端的error handling。

如果您的客户不是上述情况下的最终用户,则您正在创build应用程序或库的映像,并且必须说出错了。 您应该尽可能多地返回信息,以便使用您的应用程序的人员确定您的错误所在。

所以最后:

– 对于客户:您将在前端显示您的错误,以便您了解如何pipe理错误。 – 对于开发人员:您应该尽可能多地显示错误信息。 显示堆栈跟踪,错误代码…