Express,运行 服务器上单独线程上的代码

Express, run code on a seperate thread on server

我的问题
我有一个表单,当用户提交时,我希望服务器启动一个单独的线程并 运行 该线程中的一个函数,然后将用户重定向回主页,可以关闭连接和代码仍将 运行。
本质上,目标是用户单击按钮、表单提交和服务器 运行 代码,而无需用户停留在页面上。

app.get('/lockout/', async (req, res) => {
var nnumber = req.query.nnumber;
var time = req.query.time;

for (var i = 0; i < time; i++) {
    console.log(nnumber + " is locked out");
    sleep(1000);
}

res.send("Locked out");
});

注释
请原谅我对 Node 和 express 缺乏经验,我是新手所以请详细解释,我的主要语言是 C# 和 C++。我正在 运行在 DigitalOcean 上使用 nginx 反向代理 Ubuntu VPS。

你想做的是所谓的“异步任务处理”,需要更多的东西。

我会使用 bull 作为框架来处理基于 Redis 的队列。这将使您可以将表单提交请求存储在队列中并在新进程中处理它,用户可以在提交表单后关闭连接。

在 NodeJs 中它可能看起来像

npm install bull --save
const Queue = require('bull');
//....


export class FormQueue{
  constructor(){
    // initialize queue
    this.queue = new Queue('formSubmits');
    // add a worker
    this.queue.process('forms', job => {
      this.sendEmail(job)
    })
  }
  addFormToQueue(data){
    this.queue.add('forms', data)
  }
  async sendEmail(job){
    const { to, from, subject, text, html} = job.data;
    const msg = {
      to,
      from,
      subject,
      text,
      html
    };
    try {
      await sgMail.send(msg)
      // mark the task as complete.
      job.moveToCompleted('done', true)
    } catch (error) {
      if (error.response) {
        job.moveToFailed({message: 'job failed'})
      }
    }
  }
}

致谢/更多信息:https://blog.logrocket.com/asynchronous-task-processing-in-node-js-with-bull/