javascript - Node.js Express 网站实时更新数据

标签 javascript node.js express socket.io pug

我正在尝试实现一些我认为应该非常简单的事情,但我发现的所有教程和示例似乎都有点矫枉过正。

我在做什么: 我定期获取天气信息,并且希望每次获取时更新网站上的文本,而无需用户刷新浏览器。

几乎所有关于实时数据更新的教程都建议使用socket.io,我已经尝试过,但我无法让它做我想做的事,我开始认为应该有一种更简单的方法, socket.io 可能不是解决这个问题的最佳方法。有什么建议么?如何在网站上获得简单的文本行更新,而无需用户刷新页面?

我的天气脚本:

var express = require('express');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);


function refreshWeather() {
    var temperature = getTemperature();
    io.sockets.emit('broadcast', {
        temperature : temperature
    });
}

我的 Jade 脚本:

doctype html
html
  head
    link(rel='stylesheet', href='/css/index.css')
    title Dashboard
  body
    script(src='/socket.io/socket.io.js')
    script.
      var socket = io();
      socket.on('broadcast', function (data) {
      // UPDATE WEATHER HERE
      });

    .main-content
      h1 Weather is: // I WANT THIS TO BE UPDATED

最佳答案

你可以:

  • 摆脱socket.io。
  • 确定检索温度的终点。
  • 在前端进行一些轮询。

后端看起来像这样:

var express = require('express');
var app = express();
var server = require('http').Server(app);

app.get('/weather', function (req, res) { 
    res.send(getTemperature()) 
});

前端看起来像这样:

doctype html
html
  head
    link(rel='stylesheet', href='/css/index.css')
    title Dashboard
  body
    .main-content
      h1(id='weather') Weather is: // I WANT THIS TO BE UPDATED
    script.
      setInterval(function () {
        fetch('/some/url', {
          method: 'get'
        }).then(function(response) {
          // UPDATE WEATHER HERE
          document.getElementById('weather').innerHTML = response
        }).catch(function(err) {
          // Error :(
        });
      }, 1000) // milliseconds

代码完全未经测试,因此请尽量不要复制和粘贴 - 而是对其进行修改。另外,如果您要使用 fetch API ,您可能想使用 polyfill ,否则,只需使用普通 ajax .

关于javascript - Node.js Express 网站实时更新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37602748/

相关文章:

node.js - 云数据存储和 Node.js : Cannot get entity

javascript - 计数器在 jQuery 中不起作用

javascript - 如何访问绑定(bind)的 polymer 数据并在脚本中使用它?

javascript - 使用 return 与 this 的优势

javascript - Node.js 的垃圾收集器

mysql - 如何使用meteor设置mysql

node.js - 无法使用Node JS/Express JS和Postman获取POST数据

javascript - 将定义添加到 Typescript 中的现有模块

javascript - 如何通过 aws-sdk(javascript 或 Node )获取 s3 存储桶大小

javascript - Express router 将 style.css 作为 request.params 传递并且可能调用路由两次?