【问题标题】:How to avoid having a mixture of GET request and socket.io messages?如何避免混合使用 GET 请求和 socket.io 消息?
【发布时间】:2015-11-18 20:08:58
【问题描述】:

我正在学习如何使用 node.js、angular.js 和 socket.io 开发一个实时网站,并且像这样相对快速地启动和运行:

html

<div ng-controller="myController">
   <p> {{name}} = {{value}} </p>
</div>

客户端 js

var app = angular.module("myApp",[]);
var socket = io()

app.controller("myController", function($scope, $http) {

    $http.get("myData").then(function(response){
        $scope.name = response.data.name
        $scope.value= response.data.value
    });

    socket.on('myDataSocketMsg', function(message){
        $scope.$apply(function(){
            $scope.name = message.name
            $scope.value = message.value
        });
    });
});

服务器端 js

// data from text file
function getDataFromFile() {
   data = JSON.parse(fs.readFileSync('dataFile'));
   io.socket.emit("myDataSocketMsg",data)
};
fs.watchFile('dataFile', function(curr, prev) {
    getDataFromFile();
});
getDataFromFile();

// router
app.get('/myData', function(req, res){
    res.json(data);
});

如您所见,它在页面首次加载时使用 get 请求填充 html,并在服务器中的 json 更改时使用套接字消息将更新推送到视图。如果我不在客户端中使用 get 请求,那么 html 在页面首次加载时不包含任何数据。当然,当我更新数据文件时,套接字仍然会更新它。

这对我来说感觉很笨拙,因为我必须在服务器和客户端上做两次事情:服务器必须通过路由器使 json 可用并通过套接字消息发送它。并且客户端必须处理将数据解析为套接字和获取请求的 $scope.name 和 $scope.value。

是否有更好/更优雅/最佳实践方法来实现这一目标?有没有办法摆脱获取请求来初始填充 html 的需要?

【问题讨论】:

    标签: angularjs node.js socket.io


    【解决方案1】:

    您可以使用服务器端的连接事件来发送初始数据。

    io.on('connection', function (socket) {
      data = JSON.parse(fs.readFileSync('dataFile'));
      io.socket.emit("myDataSocketMsg",data)
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多