在服务器端Node.JS上倒数到一个时间并发送一个页面的响应

Count down to a time on the serverside Node.JS and send response of a page

本文关键字:一个 并发 响应 时间 服务器端 JS Node 倒数      更新时间:2023-09-26

我有一个问题,我似乎只是不知道如何做-

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

现在-我已经尝试在客户端做倒计时。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是毫无意义的,因为"如果一棵树倒下了,没有人听到它,它会发出声音吗?"-或者别的什么:)那么我如何在服务器上做同样的事情呢?并且-在时间结束时,我如何向用户发送弹出窗口-或者至少将他重定向到一个页面。我是否需要将其绑定到来自客户端的某些请求?因为它违背了在00:00做这件事的目的。我的DB是MongoDB,所以我可以在必要时使用它。

我希望这个问题不要太长!谢谢你

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

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