当前位置: 首页 > 知识库问答 >
问题:

使用mongoDB和javascript进行数据服务器端处理

年良骏
2023-03-14

嗨,我在试图理解如何使用datatables进行服务器端处理时遇到了一些主要问题。在某些背景下,我使用一个服务调用Gamesparks为视频游戏创建后端,在这个服务中,他们有一个mongodb的实现。

我有一个endpoint可以获取所有用户,我可以在表中看到他们,但问题是我获取了所有用户,如何实现分页?。在文档中,他们声明我们必须将serverSide设置为true,但不起作用。我真的不知道如何继续我需要帮助。

Gamesparks事件以获取所有用户

require("LeaderboardMethods");

var playerList = Spark.runtimeCollection("playerList").find({},{"_id":0});

var finalData = [];

while(playerList.hasNext()){
    var current = playerList.next();
    var playerStats = Spark.runtimeCollection("playerStatistics").findOne({
        "playerId":current.playerId
    });

    var loadedPlayer = Spark.loadPlayer(current.playerId);
    var score = getScore(current.playerId);
    if(loadedPlayer === null){
        var toReturn = {
            "playerId": current.playerId,
            "displayName": current.displayName,
            "email": "DELETED",
            "rank": current.rank,
            "coins": "DELETED",
            "ban": "DELETED",
            "score": score
        }
        finalData.push(toReturn);
    } else{
        var coins = loadedPlayer.getBalance("COIN");

        var toReturn = {
            "playerId": current.playerId,
            "displayName": current.displayName,
            "email": current.email,
            "rank":playerStats.rank,
            "coins": coins,
            "ban": playerStats.isBlocked,
            "score":score

        }
        finalData.push(toReturn);

    }

}

Spark.setScriptData("playerList",finalData);

数据表调用

App.getUsers = function(){
var bodyData = {
  "@class": ".LogEventRequest",
  "eventKey": "GET_PLAYER_DATA",
  "playerId": "MY_ID"
}

var table = $('#table1').DataTable({
  "dom": "<'row be-datatable-header'<'col-sm-4'l><'col-sm-4'B><'col-sm-4'f>>" +
    "<'row be-datatable-body'<'col-sm-12'tr>>" +
    "<'row be-datatable-footer'<'col-sm-5'i><'col-sm-7'p>>",
  "buttons": [
    {
      text: 'Edit',
      action: function (e, dt, node, config) {
        var sel_row = table.rows({
          selected: true
        }).data();

        if (sel_row.length != 0) {
          window.location.href = "edit-user.html";
          localStorage.setItem("editUser", JSON.stringify(sel_row[0]));
        }

      }
    },
    {
      text: 'Create',
      action: function (e, dt, node, config) {
        window.location.href = "create-user.html";
      }
    },
    {
      text: 'Delete',
      className: 'delete-btn',
      action: function (e, dt, node, config) {
        var filtered = table.rows({
          filter: 'applied',
          selected: true
        }).data();

        // Only open modal when are users selected
        if(filtered.length != 0){
          $("#proceed-delete").prop('disabled', true)
          $("#mod-danger-delete").modal();

          if(filtered.length != 1) {
            $('#length-users').append(document.createTextNode(filtered.length + " users"));
          } else {
            $('#length-users').append(document.createTextNode(filtered.length + " user"));
          }

          $("#delete-confirmation").change(function () {
            if ($("#delete-confirmation").val() === "DELETE"){
              $("#proceed-delete").prop('disabled', false)
              $('#proceed-delete').on('click', function () {
                if (filtered.length === 1) {
                  deleteUserRequest(filtered[0]);
                } else {
                  for (let index = 0; index < filtered.length; index++) {
                    deleteUserRequest(filtered[index])
                  }
                }
              });
            }
          });
        }
      }
    }, 'selectAll', 'selectNone'
  ],
  "paging":true,
  "pageLength":50,
  "serverSide":true,
  "ajax": {
    "data": function (d) {
      return JSON.stringify(bodyData);
    },
    "contentType": "application/json; charset=utf-8",
    "url": config.REQUEST_API + '/rs/' + config.API_CREDENTIAL_SERVER + '/' + config.API_SERVER_SECRET + '/LogEventRequest',
    "type":"POST",
    "dataSrc":function(json){
      console.log(json);

      $('#loading-row').removeClass('be-loading-active');
      return json.scriptData.playerList
    },
  },
  "columns": [
        {
          data: null,
          defaultContent: "<td></td>",
          className: 'select-checkbox'
        },
        { data: "playerId"},
        { data: "displayName" },
        { data: "email" },
        { data: "score"},
        { data: "rank" },
        { data: "isBlocked" },
        { data: "coins" },
        {
          "data": null,
          "defaultContent": "<button class='btn btn-space btn-primary' onclick='App.click()'>View more</button>"
        }
      ],
  "select": {
    style: 'multi',
    selector: 'td:first-child'
  },
}).on('error.dt', function(e, settings, techNote, message){
  var err = settings.jqXHR.responseJSON.error;
  // GS err
  if(err === "UNAUTHORIZED"){
    location.href = "pages-login.html";
    return true;
  } else{
    $('#error-container-dt').show();
    console.log(message);
    return true;
  } 
});

}

共有1个答案

能钟展
2023-03-14

快速浏览Gamesparks SDK并发现以下示例:

ListTransactionsRequest
  dateFrom      Optional date constraint to list transactions from
  dateTo        Optional date constraint to list transactions to
  entryCount    The number of items to return in a page (default=50)
  include       An optional filter that limits the transaction types returned
  offset        The offset (page number) to start from (default=0)

现在,对于分页,您需要entryCount和偏移量。首先是一页大小,默认50,你可以改变它。服务器返回记录的entryCount no。

偏移量是起始记录。例如,初始列表(第1页)确实有50条记录,单击“下一步”按钮将向服务器发送请求“偏移量:51”。服务器回复记录从50(偏移量)到100(偏移量入口计数)。

var bodyData = {
  "@class": ".LogEventRequest",
  "eventKey": "GET_PLAYER_DATA",
  "playerId": "MY_ID",
  "entryCount": entryCount,  // you have to send it if you dont like the default value
  "offset": offset  // gets his value from "NEXT" or "PREV" button 
}

这就是分页的工作原理。我不能给出更详细的答案,因为我自己不使用游戏公园。希望它至少给你一些指导。

 类似资料:
  • 我正在使用Datatables在我的Web应用程序中显示表格数据,并将其配置为利用服务器端处理,即通过AJAX查询服务器以查找过滤后的数据。我想根据特定于我的应用程序的附加参数进行筛选,即对应于某些用户选项(例如,通过UI中的复选框)。如何使DataTables将这些附加的筛选器参数传递到服务器?

  • 我是新来的数据。我试图找到解决方案的服务器端处理,因为过去两天,但没有找到解决方案。 我的JS代码是 可数据以表格式呈现JSON。但是排序、分页和搜索操作是行不通的。无论我从下拉列表中选择了多少值,它都会在第一页显示所有结果 在底部,它还显示了像“显示0到0的0个条目(从NaN总条目中过滤)”这样的消息 如果我通过服务器端:false。一切正常。但我希望服务器端处理相同的数据 任何帮助都将不胜感激

  • 问题内容: 对于需要快速刷新数据的应用程序,使用JavaScript轮询服务器的最佳实践是什么?我将jQuery用于前端,将Java Spring Framework用于后端。 刷新数据的示例可以是很快(每1秒)更新一次的项目列表。 问题答案: 您可能想使用jQuery的Ajax函数每秒钟左右轮询一次服务器。然后,服务器可以近乎实时地向浏览器发出指令响应。 您也可以考虑使用长轮询而不是上面的方法,

  • 本文向大家介绍MongoDB服务端JavaScript脚本使用方法,包括了MongoDB服务端JavaScript脚本使用方法的使用技巧和注意事项,需要的朋友参考一下 常用JavaScript语句 在mongo shell运行JavaScript脚本   切换数据库:   运行如下脚本: 可将上述脚本保存为dbaStatCollections.js,  在linux shell下运行   或在mo

  • 我是Java新手,希望接受包含股市详细信息的字符串。如果现有字符串包含脚本的购买订单,请按给定价格查找卖家。如果没有匹配项可用,则将新订单添加到现有采购订单队列。 这些需要尽可能快地完成,或者最好并行完成,以便给定的应用程序可以在最短的时间内处理尽可能多的订单。

  • 问题内容: 我正在尝试为我的react应用设置服务器端渲染,并且试图使用出色的react-router模块来处理非js情况(某些爬虫,当用户关闭js时,原因)。但是,我遇到了麻烦。我一直在这里使用出色的响应作为各种指南,但我却遇到了奇怪的错误。尝试使用时,我会坚持不懈。我是否设置了服务器端渲染错误,缺少明显的东西或其他东西? 我的设置: 真正的基本Express服务器 顶级反应组件 输出: 问题答