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理错误。 – 对于开发人员:您应该尽可能多地显示错误信息。 显示堆栈跟踪,错误代码…