首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用deepstream.io进行实时投票

使用deepstream.io进行实时投票
EN

Stack Overflow用户
提问于 2016-03-10 14:44:00
回答 1查看 716关注 0票数 1

我用deepstream.iorethinkdb作为持久化存储,制作了一个实时投票系统的原型。到目前为止,它可以工作,多个浏览器可以保持同步以获得最新的投票计数(请参见下面的屏幕快照),但是,我不喜欢的一件事是,vote count在浏览器中递增,后者被发送到deepstream.io远程服务器。

嵌入客户机浏览器中的JS代码:

代码语言:javascript
复制
/**
        * Login to deepstream as Frank
        */
        var ds = deepstream( 'localhost:6020' ).login({ username: 'Frank'});
        var name = 'upvote';
        var upVotes;
        var voteText = $('.streaming-prices .vote');
        var record = ds.record.getRecord(name);
        $('#upvote_btn').click(function() {
            // on button click, increment the vote counts
            // set the record stored in the rethinkdb storage
            record.set({
                count: ++upVotes
            });
        });

        record.subscribe('count', function(newVal) {
            console.info('count updated, newVal: ', newVal);
            upVotes = newVal;
            voteText.text(newVal);
        });

server.js代码:

代码语言:javascript
复制
var PermissionHandler = require( './permission-handler' );

var DeepstreamServer = require( 'deepstream.io' ),
    RdbC = require( 'deepstream.io-storage-rethinkdb' ),
    server = new DeepstreamServer();

server.set('host', '0.0.0.0');
server.set('port', 6020);
server.set( 'tcpHost', '0.0.0.0' );
server.set( 'tcpPort', '6022' );
server.set( 'permissionHandler', new PermissionHandler() );

server.set( 'storage', new RdbC({
    port: 28015,
    host: '127.0.0.1',
    splitChar: '/',
    database: 'votings',
    defaultTable: 'question'
}));

server.start();

因此,您可以看到客户机中的js代码直接增加投票数并更新记录,该记录将被发送到deepstream.io服务器以更新数据库。我不喜欢这个部分,因为我不想让用户搞砸总票数。相反,我希望客户机只向服务器发送类似+1的内容,并让服务器更新持久性的总数。我不知道这是否可能,有人能给我一些启示吗?我很感激

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-10 18:31:04

好的一点,允许客户操纵选票可能不是那么好!

我会使用rpc,这样在浏览器中您就可以让受信任的提供者代表用户增加记录。

你需要做的三件事是:

  1. 通过浏览器请求rpc
  2. 从rpc提供程序(可以响应rpc的受信任客户端)响应它
  3. 添加权限,以拒绝从非提供程序更改记录的任何尝试。

代码如下所示:

浏览器中的JS代码

代码语言:javascript
复制
/**
* Login to deepstream as Frank
*/
var ds = deepstream( 'localhost:6020' ).login( { username: 'Frank'} );

var voteText = $('.streaming-prices .vote');
var name = 'vote';
var record = ds.record.getRecord( name );

$('#upvote_btn').click(function() {
    // on button click, increment the vote counts
    // set the record stored in the rethinkdb storage
    ds.rpc.make( 'upvote', {}, function( error, response ){
        //notify user when upvote succesfull
    });
});

record.subscribe('count', function( newVal ) {
    console.info( 'count updated, newVal: ', newVal);
    voteText.text(newVal);
});

是处理的rpc提供程序

代码语言:javascript
复制
/**
* Login to deepstream as Frank
*/
var ds = deepstream( 'localhost:6021' ).login( { username: 'upvote-provider' } );

var name = 'vote';
var record = ds.record.getRecord( name );

ds.rpc.provide( 'upvote', function( data, response ){
    record.set( 'count', record.get( 'count' ) + 1 );
    response.send();
});

服务器还应该拥有只允许上一级提供程序更改选票.的权限。

代码语言:javascript
复制
canPerformAction: function( username, message, callback ) {
    /**
     * If the user is a provider, it has all permissions
     */
    if( username === 'upvote-provider' ) {
        callback( null, true );
    }
    /**
     * Otherwise the client request is valid unless it's trying to change the score
     */
     else {
        var messageObj = Deepstream.readMessage( message );
        var isAllowed = messageObj.name !== 'vote' || messageObj.isRead;
        var errorMessage = isAllowed ? null : 'Can\'t change votes via client, use \'upvote\' rpc instead';
        callback( errorMessage, isAllowed );
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35919612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档