背景:在Node中,通常在异步调用中将错误对象传递给回调函数,这在Joyent的Error handling in Node.js中也有说明。标准错误对象包含名称,消息,堆栈跟踪和可能的其他属性。传递或抛出字符串或普通对象作为错误被认为是不好的做法。使用Socket.io,可以通过发出事件并具有可选的响应回调将数据从客户端传输到服务器,反之亦然。这为传递和处理错误提供了多种方法。

问题:如果客户端发出的socket.io事件在服务器上导致错误,则最佳做法是将此事告知客户端?一个普通的错误对象作为响应?一个单独的错误事件和侦听器?错误应如何构造?有没有像Node那样的最佳实践?你在用什么

示例:想象用于登录的socket.io。客户端通过发出用户名和密码来登录,如下所示:

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

成功登录后,响应中包含 session token 。但是,如果用户名或密码不匹配怎么办?我想到了几种方法:

方法1-普通错误对象:响应中可以包含一个error属性,其属性为一个类似于普通错误的对象作为其值,并带有标准名称和消息属性以及可能的其他属性:
{
  error: {
    name: 'InvalidUsernameOrPasswordError',
    message: 'Username or password was invalid.',
    usernameExists: false
  }
}

客户端因此测试响应是否包含错误,如果没有,则继续登录过程:
socket.emit('login', {user: 'Foo', pass: 'Bar'}, function (response) {
  if (response.hasOwnProperty('error')) {
    // handle error
  }
  // do something with response.token
});

方法2-简单字符串:与方法1类似,但error属性只是表示错误名称的纯字符串。
{
  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'});

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

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

最佳答案

这取决于您的“客户”。如果最终用户像使用应用程序的人一样,那么他们实际上并不在乎您如何发送错误。最后,您将在前端有一段文字说他们错了。因此,您是必须选择在后端实现错误处理的首选方式。

如果您的客户不是上述情况的最终用户,则对您正在创建的应用程序或库进行镜像,您必须说有一个错误。您应该返回尽可能多的信息,以便使用您的应用程序的人识别出错误的位置。

所以最后:

-对于客户:您将在前端显示错误,以便您自行管理错误。
-对于开发人员:您应该显示尽可能多的错误信息。显示堆栈跟踪,错误代码...

07-24 09:39
查看更多