我创建了一个节点服务器,它调用 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 + " %");
});
};
提前谢谢!
答案 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"))