我目前正在使用Node.js作为服务器(Express.js)和客户端的AngularJs,从基于HTTP的API切换到WebSockets(使用Socket.io),以提高性能。
由于WebSockets缺少状态代码/错误管理,只是通过可选的回调返回JSON,我必须实现此错误管理。 当发生错误时我想要一致的行为,而不是手动检查这个错误我想包装它以减少我的代码中的boilplate使用Promises而不是基于旧的回调。
例如,而不是在angular:
中使用原始socket.iosocket.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]
}
我认为使用Promise而不是回调来处理WebSockets是一个基本而且需要的,但由于某些原因,我发现所有的库都没有用Promises包装回调,这导致了如果我错过了什么,我会回答这个问题吗?
由于
答案 0 :(得分:0)
var ownhandler={};
ownhandler.request(query){
o={};
o.query=query;
o.then=function (callback){
calltheserver(this.query,function(){
callback();
}
};
return o;
}
我不确定它是否是你想要的,但现在你可以这样做:
ownhandler.request("whatever").then(function(){
//function finished
}
但是你必须更换" calltheserver()"具有实际功能。
答案 1 :(得分:0)
以下是我到目前为止在客户端实现它的方式(未经测试),不确定是否有更好的库或解决方案来解决基于Websocket的请求 - 响应API。
客户端代码(Angular.js)
angular.module('app.web-sockets', [])
.factory('wsClient', function createWebSocketClient(socket, $q, assert, $timeout) {
function WebSocketClient(socket) {
this._socket = socket;
}
WebSocketClient.prototype.request = function request(url, data, options) {
var wrappedRequest = {
data: data
};
var deferred = $q.defer();
var resolved = false;
socket.emit(url, wrappedRequest, function responseCallback(response) {
if (response.success) {
deferred.resolve(response.data);
resolved = true;
} else {
deferred.reject(response);
resolved = true;
}
});
return deferred.promise;
};
return new WebSocketClient(socket);
})