【问题标题】:node-mongodb Protection against websocket data lossnode-mongodb 防止 websocket 数据丢失
【发布时间】:2017-07-22 18:29:17
【问题描述】:

我在使用SocketCluster 发布/订阅的 websocket API 的客户端。

身份验证后,我通过

接收每秒一次的 json 数据
SCsocket.on('authenticate', function(){
   var channel = SCsocket.subscribe('channel1');
   channel.watch(function(data){
      console.log(data); 
   });
});

形式

[
  {
      "product": "Product1",
      "price":   "10.0" 
  },
  {
      "product": "Product2",
      "price":   "15.0"  
  }
]

我不会打印数据,而是将其保存到 mongo db。

如果某些数据无法上传,我需要某种安全网。回想起来,允许我将数据从 websocket 上传到 mongo db。

这样做的最佳做法是什么?我希望这个问题不要太宽泛,我是 node 和 mongo db 的新手。

谢谢!

【问题讨论】:

    标签: node.js mongodb socketcluster


    【解决方案1】:

    这是一个如何处理数据并将其保存到 Mongo 的示例。我没有运行 mongo 服务器,因此您必须检查保存是否确实有效。但原理是有的。

    不确定您所说的安全网是什么意思,但我添加了检查以查看数据是否已定义,您应该针对自己的具体情况进行更多检查。

    如果您需要任何关于特定问题的帮助,请告诉我。

    SCsocket.on('authenticate', function () {
    
        // subscribe to channel 1
        var channel = SCsocket.subscribe('channel1');
        channel.watch(function (data) {
            // if there is any data
            // you should do more specific checks here
            if (Object.keys(data).length > 0) {
    
                // connect to mongo
                MongoClient.connect(url, function(err, db) {
    
                    assert.equal(null, err);
    
                    // insert data
                    insertDocument(data, db, function() {
                        db.close(); // close db once insert
                    });
                });
            } else {
                // handle invalid data
                console.log('data sent is invalid');
                console.log(data);
            }
        });
    });
    
    
    // insert into mongo
    var insertDocument = function (data, db, callback) {
    
        // save into product
        db.collection('product').insertOne(
            // insert data sent from socket cluster
            data, function (err, result) {
            assert.equal(err, null);
            console.log("Inserted successfully into");
            console.log(result); // output result from mongo
            callback();
        });
    };
    

    【讨论】:

    • 支票是有效的,但这不是我的意思。我试图防止 mongo 服务器关闭一个小时并且 websocket 在此期间发出的所有数据都丢失的情况。我想我需要第二台服务器来启动。
    • 如果 mongo 服务器没有运行,我建议通过 SocketServer 向用户返回一个不错的 DB down 错误。如果您的数据库没有运行,为什么要运行套接字服务器?这样您就不必处理可能与更多传入数据不同步的数据队列。
    • 不幸的是,我无法决定套接字服务器何时运行。我在 websocket 的客户端
    • 哦!那么您的意思是:套接字服务器向您发送数据并且您想要保存该数据,或者如果您的 mongodb 服务器关闭,则将其排队以备后用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2021-07-07
    相关资源
    最近更新 更多