使用 setInterval 自动重启节点服务器

时间:2021-02-20 16:54:51

标签: node.js cron settimeout setinterval

我创建了一个节点服务器,它调用 API 并在 index.js 中显示数据。我希望节点服务器 (app.js) 自动重新启动,以便 API 调用每 10 秒左右刷新一次,并且数据始终是最新的。

是否可以将 app.js 的整个代码包装在一个函数中并使用 setInterval 或 setTimeout(如果某些事情发生变化,也可以使用永远节点重新启动服务器)?还是我需要使用 crontab 等调度程序?

仅供参考:我对编程主题完全陌生,因此如果您提供任何帮助和建议,我将不胜感激。

app.js 看起来像这样:

const something = require("some node module");
async () => {
    const connection = new something({
        email: "email",
        password: "password",
        region: "us",
    });

    const temperature = await connection.getDeviceCurrentTemperature("some ID");
    const humidity = await connection.getDeviceCurrentHumidity("some ID");

    const express = require("express");
    const app = express();

    var bodyParser = require("body-parser");

    app.use(express.static("public"));

    app.set("view engine", "ejs");
    app.set("views", __dirname + "/views");

    app.use(bodyParser.urlencoded({ extended: false }));

    app.get("/", (req, res) => {
        res.render("index", { temp: temperature.temperature, hum: humidity.humidity });
    });

    app.listen(8080, () => {
        console.log("Temperature: " + temperature.temperature + " °C, Humidity: " + humidity.humidity + " %");
    });
};

提前谢谢!

2 个答案:

答案 0 :(得分:1)

您无需重新启动整个服务器即可执行此操作。您的 app.listen 仅在您的服务器运行时执行一次。但是每次客户端向路径“/”发送 GET 请求时,您的 app.get 都会被调用。

你能做的就是移动

    const temperature = await connection.getDeviceCurrentTemperature('some ID');
    const humidity = await connection.getDeviceCurrentHumidity('some ID');

在您的app.get

app.get("/", (req, res) => {
    // you could even parallelize these calls
    const temperature = await connection.getDeviceCurrentTemperature('some ID');
    const humidity = await connection.getDeviceCurrentHumidity('some ID');

    res.render("index", {temp: temperature, hum: humidity});
}); 

这样数据会在每次连接时刷新。

答案 1 :(得分:0)

只需通过 GET / 调用获取温度和湿度。这是一个盲码,希望它有效

const something = require('some node module'),
      express = require('express'),
      app = express()
      connection = new something({
          email: 'email',
          password: 'password',
          region: 'us',
      })

app.use(express.static('public'))
app.set("view engine", "ejs")
app.set("views", __dirname + "/views")

app.get("/", async (req, res) => {
  res.render("index", {
    temp:   await connection.getDeviceCurrentTemperature('some ID'),
    hum:    await connection.getDeviceCurrentHumidity('some ID')
  })
})

app.listen(8080, () => console.log('server running'))

或者,您可以在没有数据的情况下在 / 上加载索引,然后每隔一段时间使用 json 数据获取 /api,这样您的页面就可以获取当前数据(每 10 秒左右),而无需重新加载.

app.get('/api', async (req, res) => {
  // parallel loading
  const [ temp, hum ] = await Promise.all([
    connection.getDeviceCurrentTemperature('some ID'),
    connection.getDeviceCurrentHumidity('some ID')
  ])
  
  res.json({ temp, hum })
})

app.get('/', (req, res) => res.render("index"))
相关问题