【问题标题】:AngularJS - Socket.io - ExpressJS : How to set up a realtime counter?AngularJS - Socket.io - ExpressJS:如何设置实时计数器?
【发布时间】:2014-05-14 14:17:07
【问题描述】:

我的目的是创建一个实时计数器。实际上我正在用我的服务器创建文件。而且我希望对于每个创建的文件,计数器都会增加(客户端应该看到浏览器中的文件数量在增长......)

我怎样才能使用 Socket.io、AngularJS 和 Express.js 准确地做到这一点?

P.S : 我已经写了一些代码,但是没有用。

编辑 1:

public/core.js

var app = angular.module('app', []);

app.factory('socket', function($rootScope){ 
    var socket = io.connect(); 
    return{ 
        on: function(eventName, callback){ 
            socket.on(eventName, function(){ 
                var args = arguments; 
                $rootScope.$apply(function(){ 
                    callback.apply(socket, args); 
                }); 
            }); 
        }, 
        emit: function(eventName, data, callback){ 
            socket.emit(eventName, data, function(){ 
                var args = arguments; 
                $rootScope.$apply(function(){ 
                    if(callback){ 
                        callback.apply(socket.args); 
                    } 
                }); 
            }) 
        } 
    }; 
}); 


function mainController($scope, $http, socket) {
    $scope.formData = {};

    socket.on('number', function (data) {
        console.log("Socket on number core.js !");
        $scope.number = data.numberOfFiles;
    });

    $scope.initialize = function() {
        $scope.formData.search = "";
        console.log("initialize() body !");
    };

    $scope.search = function() {

        socket.emit('next', {
            message: "next"
        });     

        console.log("search() body !");
        $http.post('/search', $scope.formData)
            .success(function() {
                $('input').val('');
            })
            .error(function(data) {
                console.log('Error: ' + data);
            });
    };
}

app.js

/**
 * Module dependencies.
 */

var express = require('express');
var request = require('request');
var http    = require('http');
var path    = require('path');

var url = require('url');
var cheerio = require('cheerio'); // builds the DOM tree
var fs = require('fs');

var app = express();

// all environments

app.configure(function() {
    app.use(express.static(__dirname + '/public'));         // set the static files location /public/img will be /img for users
    app.use(express.logger('dev'));                         // log every request to the console
    app.use(express.bodyParser());                          // pull information from html in POST
    app.use(express.methodOverride());                      // simulate DELETE and PUT
    app.use(express.json());
    app.use(express.urlencoded());
    app.use(app.router);
});

// app.listen(8080);
// console.log("App listening on port 8080");


var server = http.createServer(app);
var io = require('socket.io').listen(server);

server.listen(8080);

var numberFiles = 1;

app.post('/search', function(req, res){

    var keyword = req.body.search;  

    for(var i = 0; i < 100; i++) {  
        // The results' page URL
        // some long logic that creates files and increments numberFiles
        numberFiles++;
    }
});

io.sockets.on('connection', function (socket) {
    socket.on('next', function (data) {
        socket.emit('number', {
            numberOfFiles: numberFiles
        });
    });
});

app.get('/', function(req, res) {
    res.sendfile('./public/index.html'); // load the single view file (angular will handle the page changes on the front-end)
});

【问题讨论】:

  • 我已经编辑了我的帖子。
  • 我认为 angular 正在与 /socket.io/1/ 的路线搞混,至少对我来说是这样。我只是在客户端上得到Uncaught TypeError: Cannot call method 'onClose' of null

标签: angularjs express socket.io


【解决方案1】:

你试过了吗:

服务器

io.sockets.on('connection', function (socket) {
    socket.on('next', function (data, respond) {
        respond({
            numberOfFiles: numberFiles
        });
    });
});

客户

   socket.emit('next', {
        message: "next"
    }, function(data){ // data.numberOfFiles ... };

【讨论】:

    猜你喜欢
    • 2016-12-26
    • 2019-06-19
    • 1970-01-01
    • 2016-08-15
    • 2016-12-17
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多