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

我有一个问题,我似乎无法find如何去做 –

我见过很多客户端倒计时插件,我有一个在我的应用程序 – 但是我有兴趣计数到我的服务器上的某个date,一旦这个date和时间到了,我想触发一个响应客户端一个popup页面。

现在 – 我已经尝试在倒计时.onFinishfunction在客户端做到这一点。 但是从我的理解来看,除非客户端在倒计时完成时在应用程序中,否则无法工作。 我是否正确地认为客户端脚本只在客户端进入应用程序时生成? 因此,当用户进来时,计时器已经重新启动(在login我更新计时器倒数到最近的星期一在21:00)。 在服务器上 – 我可以检查date是否已经到达,在一个函数之外,但这只会发生一次部署,是否正确? 如果我每隔一段时间检查一次,每次更新应用程序,这些时间间隔都会变得混乱,我可能会错过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是毫无意义的,因为“如果一棵树掉下来,没有人听到,它会发出一个声音吗? – 或者什么的:)那么我怎样才能在服务器上做同样的事情呢? 并且 – 在最后的时候,我该如何向用户发送一个popup窗口 – 或者至less将他redirect到一个页面。 我需要将它绑定到客户端的一些请求吗? 因为它比00:00打败了它的目的。 我的数据库是MongoDB,所以我可以使用,如果有必要。

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

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

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

Interesting Posts