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