发送响应后如何在node.js api中运行后台任务?

Posted

技术标签:

【中文标题】发送响应后如何在node.js api中运行后台任务?【英文标题】:How to run background task in node.js api after sending response? 【发布时间】:2018-08-14 17:57:32 【问题描述】:

我有一个要求,我必须在返回 api 响应后运行一分钟的后台进程。那个后台进程会对mongodb做一些操作。

我的方法是,我在返回响应后为后台进程发出一个事件。

这个操作有什么最好的方法吗?请帮帮我。

谢谢,

【问题讨论】:

你在哪里可以做到这一点? 【参考方案1】:

您可以使用 EventEmitter 来触发后台任务。

或者您可以在返回响应之前触发异步任务。

我会实现某种简单的内存队列。在返回响应之前,我会在队列中添加一个任务,发出一个事件告诉监听器队列中有任务。

编辑:

我不确定我是否完全理解您的用例。但这可能是一种方法。

如果您没有执行 mongo 的参考,您可能需要进行一些快速查找或创建,然后返回响应,然后运行任务

const myqueue = []

const eventHandler = new EventEmitter();

eventHandler.on('performBackgroundTask', () => 

  myqueue.forEach(task => 
    // perform task
  )

)

app.get('/api', function (req, res) 

    const identificationForItemInMongo = 123

    myqueue.push(identificationForItemInMongo)

    eventHandler.emit('performBackgroundTask',     identificationForItemInMongo)

   res.send('Send the response')
)

【讨论】:

我必须返回响应,我不想增加响应时间。你能告诉我如何在这里实现内存队列吗?【参考方案2】:

您可以将 Promise 链用于您的方法。调用第一个 Api,一旦收到响应,就会在 UI 中显示该值,然后第二个调用将自动停止,并且不会干扰任何 UI 进程。您可以在此处参考有关承诺链的更多详细信息。

https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Promise/then

var promise1 = new Promise(function(resolve, reject) 
  resolve('Success!');
);

//Run the background process.
var promise2 = new Promise(function(resolve, reject) 
  resolve('Success!');
);

promise1.then(function(value) 
  console.log(value);
  // expected output: "Success!"
  return promise2;
).then(function(value)
  // Response for the second process completion.
).catch(function()
  // Failure for first api call/ second api call
);

【讨论】:

【参考方案3】:

当你想对 db 进行异步调用并等待结果时,你需要使用回调或在 ES6 中使用 Promise 或 async/await。

read this for more info

【讨论】:

以上是关于发送响应后如何在node.js api中运行后台任务?的主要内容,如果未能解决你的问题,请参考以下文章

如何在一定的时间间隔后运行 Node.js api?

node.js中护照身份验证后如何发送json作为响应

Node JS在rest api响应中返回图像[关闭]

如何发送 POST 请求以响应 node.js Express?

node.js中函数调用后API的响应范围

如何在 MobileFirst Foundation 8 中使用 REST API 从 Node.js 发送推送通知?