javascript - 在服务器端 Node.JS 倒计时并发送页面响应

标签 javascript node.js mongodb express countdown

我有一个问题,但我似乎不知道该怎么做 -

我见过很多客户端倒计时插件,我的应用程序上也有一个 - 但是我有兴趣在我的服务器上计数到某个日期,一旦该日期和时间到达,我想通过弹出页面触发对客户端的响应。

现在 - 我尝试在客户端使用 countdown.onFinish 函数执行此操作。但从我的理解来看,除非客户端在倒计时完成时位于应用程序中,否则它将无法工作。我是否正确假设客户端脚本仅在客户端进入应用程序时生成?因此,当用户进来时,计时器已经重新启动(登录时我更新计时器以倒计时到最近的星期一 21:00)。 在服务器上 - 我可以在函数之外检查日期是否已到达,但这只会在部署时发生一次,对吗?如果我以某种间隔检查它,每次更新应用程序时,这些间隔都会变得困惑,我可能会错过 00:00 小时。

这是我在服务端的想法(使用expressJS,nodeJS)

var today = new Date();
var currentDay = today.getDay() + 1;
var currentMonth = today.getMonth() + 1;
var currentDate = today.getDate();
var currentYear = today.getFullYear();
//var date = [02, 22, 2014];
var dateTillMatch = findNearestMonday(currentDay, currentDate, currentMonth, currentYear);
if (dateTillMatch[0] == currentDay && dateTillMatch[1] == currentDate && dateTillMatch[2] == currentMonth && dateTillMatch[3] == currentYear) {
    updateAllStats();
}

这就是我在客户端的内容 - 它不起作用 - 因为在 00:00 时我的用户都不在应用程序内! (我知道天才..)

function timer(date) {
    $('#clock').countdown(date[2] + '/' + date[0] + '/' + date[1] + ' 21:30:00', function(event) {
        $(this).html(event.strftime('%D days %H:%M:%S'));
    }).on('finish.countdown', function(event) {
        var played = localStorage.getItem('attending');
        //If the player was attending/not attending at end of countdown, send to DB that GamesPlayed ++ or gamesNotPlayed ++
        if (played == 1 || played == -1) {

            var request = false;
            var result = null;
            var name = localStorage.getItem('first') + " " + localStorage.getItem('last');
            request = new XMLHttpRequest();
            if (request) {
                request.open("GET", "usersGamesPlayed/" + name + "_" + played);
                request.onreadystatechange = function() {
                    if (request.readyState == 4 && request.status == 200) {
                        result = JSON.parse(request.responseText);

                        if (result == null) {
                            alert('PROBLEMO');
                        } else {
                            if (played == 1) {
                                localStorage.setItem('gamesPlayed', parseInt(result.gamesPlayed));
                            } else {
                                localStorage.setItem('gamesNotPlayed', parseInt(result.gamesNotPlayed));
                            }

                            //Set back to 0
                            localStorage.setItem('attending', 0);
                            //Popup to find Best Player
                            console.log("Choose MVP");
                            $('#bestPlayerPopup').popup();
                            $("#bestPlayerPopup").popup("open");

                        }
                    }
                };
                request.send(null);
            }
        }

    });

}

总而言之 - 我明白等待客户端计数器到达 00:00 是没有意义的,因为“如果一棵树倒下而没有人听到它,它会发出声音吗?” - 或者其他的东西 :) 那么我该如何在服务器上做同样的事情呢?并且 - 在时间结束时,我如何向用户发送弹出窗口 - 或者至少将他重定向到页面。我需要将它绑定(bind)到客户端的某些请求吗?因为这违背了在 00:00 做这件事的目的。 我的数据库是 MongoDB,因此如果需要我可以使用它。

我希望问题不要太长! 谢谢

最佳答案

我会使用 websockets (http://socket.io)。使用服务器上的 node.js 计时器 API 生成事件,该事件将必要的数据发送到所有正在监听(查看倒计时页面)的客户端。

在客户端,您捕获该事件,然后使用收到的数据更新当前页面,或者向“倒计时完成”页面发出新的获取请求。

关于javascript - 在服务器端 Node.JS 倒计时并发送页面响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22319521/

相关文章:

javascript - 如何使用 RequireJS 加载 Underscore 库?

javascript - Node 使用 ObjectionJS 和 Knex,一对多,从多表中返回第一个相关行

javascript - 查找 MongoDB 中与坐标最接近的条目

python - 如何在没有 map/reduce 的情况下转换大型 Mongodb 集合中的每个文档?

javascript - Vuex,命名空间模块 setter/getter 在根 setter/getter 中不可用?

javascript - AngularJS:Restangular - 如何从 URL 中删除查询参数

javascript - 如何让多个按钮调用相同的 JavaScript

javascript - 如何通过Puppeteer获取父元素和子元素?

node.js - 应用程序部署到 Heroku 时找不到 Webpack

javascript - 我收到错误 : failed to connect to [undefined:27017]