nodejs获取正在运行的进程/promises

ax6ht2ek  于 2023-06-22  发布在  Node.js
关注(0)|答案(1)|浏览(152)

有没有一种方法可以检查是否有任何promise正在Node应用程序中运行?假设我们有以下代码片段:

router.post('/someEndpoint', async (req, res) => {
    await someFunctions();
});

我们希望创建一个端点/getRunningProcess来检查应用程序中是否有任何正在运行的进程。有没有一种通用的方法来完成这项工作,而不是编写特定于应用程序的代码来单独检查每个进程的状态?/getRunningProcess的代码看起来应该像这样:

router.get('/getRunningProcess', (req, res) => {
   // code to check for running processes or active promises
   ...
   res.status(200).json({ "process": process})
});

我们最初计划通过编写应用程序特定的代码来检查应用程序的任何运行进程的状态,但这将花费我们相当多的时间来完成所有事情。

vltsax25

vltsax251#

我假设您希望计算未解决的请求的数量。
没有内置的方法来查找处于挂起状态的promise的计数。您可以使用on-finished中间件来跟踪未解决的请求。
另外,看起来你正在使用expressjs。因此,我将使用expressjs语法编写一个示例。
您可以创建一个中间件来跟踪未解决的请求。

const onFinished = require('on-finished')

const unresolvedRequestIds = new Set()
const requestTracker = (_, res, next) => {
  const id = Math.random();
  unresolvedRequestIds.add(id)
  onFinished(res, () => {
    unresolvedRequestIds.delete(id)
  });
  next();
};

现在,您可以在任何自定义中间件之前使用此requestTracker中间件:

router.post('/someEndpoint', requestTracker, async (req, res) => {
  ...
});

要获得未解析请求的计数,可以简单地计算unresolvedRequestIds中的条目数:

router.get('/getUnresolvedRequestCount', (req, res) => {
   res.status(200).json({ unresolvedRequestCount: unresolvedRequestIds.size })
});

您可以将requestTracker中间件添加到应用程序的顶层,而不是单独添加到所有异步路由中。但请注意,这也可能会计算非异步未解决的请求。

app.use(requestTracker);

相关问题