如何在Socket.io中统计和广播一个数字

时间:2016-03-14 09:01:00

标签: node.js sockets

我有一个非常基本的网站,有一个非常基本的想法:当用户连接到网站时,它应该说"点击次数:0"当他按下键盘上的按钮时,它应该clicks++并更新到"点击次数:1" (假设没有人点击过)。

我需要使用NodeJS和Socket.io安全地执行此操作。我有计数功能,它可以工作,但我不知道如何存储点击量。通常我会在数据库或某种类型中执行此操作,然后偶尔更新一次(每次单击更新它会产生大量负载?)。

套接字更新

socket.on("update", function() {
    $("#clicks").text(clicks++);
});

jQuery emit

$("body, window").on("keyup", function() {
    socket.emit("update");
});

当我这样做时(假设我的clicks变量已定义),它将在所有客户端上更新。确实如此。

存储clicks变量的最佳方法是什么?当你最初启动网站时,显然你需要做clicks = database.get("clicks")(如果你知道我的意思)。谢谢!

1 个答案:

答案 0 :(得分:1)

由于您更喜欢将sql与nodejs一起使用,因此有一个很好的解决方案 - Sequalize

有一个way你只需使用它的实例方法就可以增加它:

User.findById(1).then(function(user) {
  return user.increment('clicks', { by: 1 })
}).then(/* ... */);

P.S: { by: 1 }是可选的。您可以找到更多示例here

example

var Clicks = sequelize.define('clicks', {
  name: { type: Sequelize.STRING, allowNull: true },
  amount: { type: Sequalize.INTEGER, defaultValue: 0 }
}, {
  freezeTableName: true
});

// Create table if not created yet
Clicks.sync();

// somewhere in your sockets callback
Clicks.findOrCreate({ where: { id: 1 }, defaults: { amount: 1 }})
      .spread(function(click, created) {
           if (created) {
              // created first time with default value, send some response back here
           } else {
             click.increment('amount', { by: 1 })
                .then(function() {
                    // send some response back to user(-s)
                });
           }
      });