如何在不重新启动我的 Express.js 项目的情况下刷新 API 端点

Posted

技术标签:

【中文标题】如何在不重新启动我的 Express.js 项目的情况下刷新 API 端点【英文标题】:How do I refresh API endpoint without restarting my Express.js project 【发布时间】:2020-06-28 17:14:48 【问题描述】:

我正在为我的 Discord Bot 创建一个 API,它可以让您获取有关某人级别和 XP 的数据。然而,它成功了。这有一个主要缺陷,那就是为了正确更新 JSON 对象中的数据。我的机器人必须重新启动。

代码如下:

const http = require('http');
const express = require('express');
const app = express();
const db = require("quick.db")
let index = 0;
app.get("/", (request, response) => 

  response.sendStatus(200);
);
app.listen(process.env.PORT);
setInterval(() => 
  http.get(`http://$process.env.PROJECT_DOMAIN.glitch.me/`);
, 20000);
require('./index.js')

let levelldb = db.all().filter(data => data.ID.startsWith(`Leveling`)).sort((a, b) => b.data - a.data);
     levelldb.length = 10; 

var levelldbs = function () 
  app.get('/api/levelldb', async function (req, res) 
    res.send(levelldb)
  )
  console.log(`Refreshed`)
 
levelldbs();

这是我尝试访问 website.com/api/levelldb 时的样子 - 成功。 注意:请忽略空值,这完全意味着数据正在等待收集,最终会在有人获得经验和等级时显示。

代码没有错误,它可以正常工作。所以我想知道如何在不重新启动项目的情况下让数据自动更新。我尝试使用 setInterval 和 setTimeout 方法,但无法解决。

我知道每次重新启动以显示数据会很烦人,但我只想知道我是否可以这样做

【问题讨论】:

【参考方案1】:

您正在分配由/api/leveldb 路由返回的单个查询结果,因此结果始终相同。将您从数据存储中提取的数据移动到根据请求进行动态提取。

此外,您的 app.get('route_name_here') 不需要包装到函数中。那是您想要从您的 api 返回的数据的外部访问点。

app.get('/api/levelldb', async function (req, res) 
    let levelldb = db.all()
          .filter(data => data.ID.startsWith(`Leveling`))
          .sort((a, b) => b.data - a.data);
         levelldb.length = 10; 

    res.send(levelldb)

阅读Express Routing 可能也会有所帮助。

【讨论】:

这似乎解决了我的问题。此外,我必须修复最后一行(右花括号)上的语法错误,现在应该可以解决问题了!谢谢。

以上是关于如何在不重新启动我的 Express.js 项目的情况下刷新 API 端点的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重新启动 apache 的情况下为站点重新加载 apache 配置?

如何启用调试 express.js/node.js 应用程序

如何在超级终端中停止运行 Node.js (Express) 服务器

如何在不重新启动的情况下卸载 Windows 服务并删除其文件

如何在不重新启动的情况下更新机器人状态中的“bot.users.size”

如何在不重新加载页面的情况下重新启动 Angular 应用程序?