【发布时间】:2016-08-13 09:58:24
【问题描述】:
我目前使用 Node.js 作为服务器 (Express.js) 和 AngularJs 在客户端,由于性能改进,从基于 HTTP 的 API 切换到 WebSockets(使用 Socket.io)。
由于 WebSockets 缺少状态代码/错误管理,并且只是返回带有可选回调的 JSON,因此我必须实现此错误管理。 当错误发生时,我想要一个一致的行为,而不是手动进行这个错误检查,我想包装它以使用 Promises 减少我的代码中的样板,而不是基于糟糕的旧回调。
例如,不要在 angular 中使用原始 socket.io:
socket.emit('users/read', {id: 2}, function handleResponse(res){
if(res.success){
var user = res.data;
socket.emit('projects/by-user', {userId: user.id}, function handleResponse(res){
if(res.success){
var projects = res.data;
// Do something with the data
} else{
// Error getting user's projects
console.log(res.error)
}
})
} else{
// Error getting user
console.log(res.error)
}
})
我想要这样的东西:
webSocketClient
.request('users/read', {id:2})
.then(function(user){
return webSocketClient.request('projects/by-user', {userId: user.id})
})
.then(function(projects){
// Do something with projects
})
.catch(function(err){
// Something went bad
})
在实现基于请求-响应 WebSockets 的 API 时,推荐的 JSON 结构是什么?或者有一个图书馆可以为我做到这一点?
我目前正在考虑使用这种结构的 JSON 作为响应:
{
success: true/false,
data: [if exists],
statusCode: [default 200 for success or 500 for failure],
error: [if exists]
}
我认为使用 Promises 而不是回调来处理 WebSockets 是一项基本且令人讨厌的要求,但由于某种原因,我发现的所有库都没有使用 Promises 包装回调,这导致我问题是我是否遗漏了什么?
谢谢
【问题讨论】:
-
为什么不写自己的承诺?
-
@jfriend00 有一种内置的方式来支持使用回调的响应/确认,因此不需要标记socket.io/docs/#sending-and-getting-data-(acknowledgements)
-
@JaromandaX 首先要做的事情-我已经实现了它并且我没有要求它,我只是觉得我错过了一些东西。仔细看看我的问题 - 我在问推荐的 JSON 结构是什么,是否有适合我的情况的库,想知道我是否将 websockets 用于基于请求-响应的 API 是错误的,因为似乎缺乏解决方案.
-
@JaromandaX 老实说,我忘记了我可以从这台计算机访问源代码,尽管我认为实现可能无关紧要,因为这里的问题是设计以及是否请求响应websockets 的 API(用 Promises 包装)是正确的,或者我正在尝试做一些不应该做的事情,因为我找不到资源和库来解决这个问题。
标签: javascript angularjs node.js websocket socket.io