【发布时间】:2017-05-15 12:43:15
【问题描述】:
我正在开发一个聊天应用程序,它是服务器端的 Node.js + MongoDB(Mongoose 库)和客户端的 Angular.js。
我有一个用于房间(应用程序中的所有房间)的数据库集合 (MongoDB),如下所示:
// ------- creating active_rooms model -------
var active_rooms_schema = mongoose.Schema({
room_name: String,
users: [String]
});
var active_rooms = mongoose.model('active_rooms', active_rooms_schema);
此数据库包含一个包含所有用户的房间(即“我的酷房间”,其中包含用户:“mike”、“joe”和“dave”)。
我想要做的是 - 每次用户想要在我的 Angular.js 客户端中的聊天室(带有一些房间名称)时,我想要:
- 如果房间不存在则创建房间
- 将该用户推入房间的 users 数组。
我知道,因为 1,我将始终拥有一个包含一组用户的房间。
这是我的 Angular 相关代码:(我不能在这里给出整个应用程序,因为它太大而且不相关。)
$scope.enterRoom = function(info) {
$q.when(create_room_if_not_exists($scope.room)).then(add_user_to_room($scope.name, $scope.room));
$location.path("chat");
}
var create_room_if_not_exists = function(room_name) {
var deferred = $q.defer();
is_room_already_exists({
'name': room_name
}).then(function(response) {
if (!response.data.is_room_exists) {
register_room({
'name': room_name
});
console.log("room: " + room_name + ", was created");
deferred.resolve();
}
}, function(error) {
deferred.reject(error.data);
});
return deferred.promise;
}
var add_user_to_room = function(user_name, room_name) {
console.log(user_name)
add_user_to_room_request({
'user_name': user_name,
'room_name': room_name
});
}
var is_room_already_exists = function(info) {
return $http({
url: '/is_room_already_exists',
method: 'POST',
data: info
});
}
var add_user_to_room_request = function(info) {
$http({
url: '/add_user_to_room',
method: 'POST',
data: info
});
}
var register_room = function(info) {
return $http({
url: '/register_room',
method: 'POST',
data: info
});
}
发生的情况是第二个动作发生在第一个动作之前。当我将日志打印到控制台时,我看到了,但我不知道为什么。
这两个操作都是通过对服务器的 HTTP 请求到达的 - 所以我认为问题不存在。
【问题讨论】:
-
如图所示,两个 XHR 将链接。位置路径将在两个 XHR 完成之前更改。当您说“第二个动作发生在第一个动作之前”时,您是在谈论 XHR 没有链接还是在 XHR 完成之前位置发生变化?
-
我说的是 XHR 没有链接
-
旁注:您可能想先尝试简单地将用户添加到房间,然后仅在第一次调用失败时才尝试创建房间。它将完全消除对
is_room_already_exists函数的需求。 -
其次,您可能需要调整 /register_room 的服务器端路由,使其也采用用户名。然后您可以自动将正在注册房间的用户添加到该房间服务器端,从而消除来自客户端的额外请求。
标签: angularjs node.js mongodb angular-promise