NodeJS,AngularJS - 在服务器中发布事件并监听
NodeJS, AngularJS - Publishing events in server and listening
我正在使用 MEAN 堆栈开发网络应用程序。在我的节点服务器上,我有一条 POST 路线 - /api/gps 远程设备以 10 秒的间隔定期向其保持 posting GPS 数据或者。我通过获取 post 正文并将诸如时间戳、tripid、纬度、经度等详细信息保存到我的 MonngoDB 集合来为这个 POST 请求提供服务。
现在这是我被困的地方 -
我有一条路线 - /displaymap 由 displaymap.jade 呈现并与控制器相关联 - MapDisplayCtrl。在这里,我必须显示来自设备的最近 posted GPS 数据的地图。那么,如何在获得新的 POST 数据后立即将地图更新为 /api/gps?
app.js 文件
var GPSData = mongoose.model('GPSData', gpsSchema);
app.post('/api/particle', function(req, res) {
GPSData.create({
tripid : req.body.tripId,
latitude: req.body.latitude,
longitude: req.body.longitude,
timestamp: Date.now()
}, function(err, doc) {
if(err) {
res.send(err);
} else {
res.send(doc);
//here is where I want to publish an event say, 'SendMapData'
//that sends co-ordinates to the controller
}
});
});
MapDisplayCtrl.js 文件
var myApp = angular.module('myapp');
myApp.controller('MapDisplayCtrl', function($http, $scope) {
//listen to the 'SendMapData' event and get the co-ordinates
//draw a google map using the co-ordinates
});
我想我需要的只是 NodeJS 端的事件发射器和 AngularJS 端的监听器,但我不知道如何实现它。我希望我已经提供了足够的信息供您回答。如果您需要更多信息,我会提供。提前致谢!
您可以使用socket.io
在服务器和客户端之间进行实时通信。
服务器:
//here is where I want to publish an event say, 'SendMapData'
//that sends co-ordinates to the controller
socket.emit('SendMapData', data);
控制器:
//listen to the 'SendMapData' event and get the co-ordinates
//draw a google map using the co-ordinates
socket.on('SendMapData', function(serverData) {
//do what you want with data received from server.
});
查看文档 socket.io
(不是最好的文档,但有帮助)
编辑
为了在 angular 应用程序中使用 socket.io
,成为 "the angular way" 我为此构建了一个服务(不是我自己,受 SO 启发):
MYAPP.factory('socket', ['$timeout', function($timeout){
var socketMethods = {},
socketio;
//fn: connect
//desc: connect to server
socketMethods.connect = function(server){
if( ! angular.isUndefined(socketio)) return;
var ioUrl = 'ws://'+ server.fullAddr;
var ioManager = {transports: ['websocket', 'polling'], reconnectionAttempts: Infinity};
socketio = io(ioUrl, ioManager);
}
//fn: on
//desc: receive data from server
socketMethods.on = function(eventName, callback){
//check if event is already registered; 'connect' registered by default, ignore it.
if(socketio.hasListeners(eventName) && eventName != 'connect') return;
socketio.on(eventName, function(serverData, respondToServer){
$timeout(function(){
callback.call(socketio, serverData, respondToServer);
});
});
}
//fn: emit
//desc: send data to server
socketMethods.emit = function(eventName, data, callback){
socketio.emit(eventName, data, function(serverResponse){
$timeout(function(){
if(callback) callback.call(socketio, serverResponse);
});
});
}
return socketMethods;
}]);
...您可以在控制器中注入 'socket',打开套接字连接和 listen/emit 事件。
我正在使用 MEAN 堆栈开发网络应用程序。在我的节点服务器上,我有一条 POST 路线 - /api/gps 远程设备以 10 秒的间隔定期向其保持 posting GPS 数据或者。我通过获取 post 正文并将诸如时间戳、tripid、纬度、经度等详细信息保存到我的 MonngoDB 集合来为这个 POST 请求提供服务。 现在这是我被困的地方 - 我有一条路线 - /displaymap 由 displaymap.jade 呈现并与控制器相关联 - MapDisplayCtrl。在这里,我必须显示来自设备的最近 posted GPS 数据的地图。那么,如何在获得新的 POST 数据后立即将地图更新为 /api/gps?
app.js 文件
var GPSData = mongoose.model('GPSData', gpsSchema);
app.post('/api/particle', function(req, res) {
GPSData.create({
tripid : req.body.tripId,
latitude: req.body.latitude,
longitude: req.body.longitude,
timestamp: Date.now()
}, function(err, doc) {
if(err) {
res.send(err);
} else {
res.send(doc);
//here is where I want to publish an event say, 'SendMapData'
//that sends co-ordinates to the controller
}
});
});
MapDisplayCtrl.js 文件
var myApp = angular.module('myapp');
myApp.controller('MapDisplayCtrl', function($http, $scope) {
//listen to the 'SendMapData' event and get the co-ordinates
//draw a google map using the co-ordinates
});
我想我需要的只是 NodeJS 端的事件发射器和 AngularJS 端的监听器,但我不知道如何实现它。我希望我已经提供了足够的信息供您回答。如果您需要更多信息,我会提供。提前致谢!
您可以使用socket.io
在服务器和客户端之间进行实时通信。
服务器:
//here is where I want to publish an event say, 'SendMapData'
//that sends co-ordinates to the controller
socket.emit('SendMapData', data);
控制器:
//listen to the 'SendMapData' event and get the co-ordinates
//draw a google map using the co-ordinates
socket.on('SendMapData', function(serverData) {
//do what you want with data received from server.
});
查看文档 socket.io
(不是最好的文档,但有帮助)
编辑
为了在 angular 应用程序中使用 socket.io
,成为 "the angular way" 我为此构建了一个服务(不是我自己,受 SO 启发):
MYAPP.factory('socket', ['$timeout', function($timeout){
var socketMethods = {},
socketio;
//fn: connect
//desc: connect to server
socketMethods.connect = function(server){
if( ! angular.isUndefined(socketio)) return;
var ioUrl = 'ws://'+ server.fullAddr;
var ioManager = {transports: ['websocket', 'polling'], reconnectionAttempts: Infinity};
socketio = io(ioUrl, ioManager);
}
//fn: on
//desc: receive data from server
socketMethods.on = function(eventName, callback){
//check if event is already registered; 'connect' registered by default, ignore it.
if(socketio.hasListeners(eventName) && eventName != 'connect') return;
socketio.on(eventName, function(serverData, respondToServer){
$timeout(function(){
callback.call(socketio, serverData, respondToServer);
});
});
}
//fn: emit
//desc: send data to server
socketMethods.emit = function(eventName, data, callback){
socketio.emit(eventName, data, function(serverResponse){
$timeout(function(){
if(callback) callback.call(socketio, serverResponse);
});
});
}
return socketMethods;
}]);
...您可以在控制器中注入 'socket',打开套接字连接和 listen/emit 事件。