【问题标题】:Is it possible to trigger a longer running background task with Next JS?是否可以使用 Next JS 触发运行时间更长的后台任务?
【发布时间】:2021-12-31 04:16:53
【问题描述】:

Next JS 似乎会在调用 API 脚本后使用一些逻辑自动“清理”API 脚本(我假设是在回调“res”之后的一段时间。是否可以让脚本运行一段时间res 回调后的不确定时间段,以便在完成一些更长时间运行的触发后台活动(如慢速渲染)之前保持活动状态?

简单的例子,一个端点可以被“轮询”来启动一个正在处理的任务,并最终以完成的结果进行响应:

api/myscript

代码:


var result = null
var processing = true

export default (req, res) => {
  if (result) {
    res.end(result)
  } else if (!processing) {
    new Promise((result, reject) => {
      exec(cmd, ("ffmpeg -takeareallylongtime", stdout, stderr) => {
      if (error) {
        reject(error);
      }
      else {
        resolve("All done");
      }
    })})
    .then(_ => {
      result = "All done!"
    })
    .catch(_ => {
      result = "I'm sorry to have failed you."
    })
    res.end("Started task")
  } else {
    res.end("Still processing...")
  }
}

我看到的行为是运行器启动,客户端定期轮询并返回有效状态,并且在处理过程中的某个时刻页面被清除:

[ event ] disposing inactive page(s)

并清除全局值跟踪结果。

【问题讨论】:

  • “API 脚本”是什么意思?你能发布一个示例脚本吗?你指的是开发服务器还是生产服务器?
  • @brandon 我指的是 api 目录中的一个组件(在服务器上运行,类似于 express 的工作方式)。我将添加一个示例。
  • 您使用该 api 方法看到的行为是什么?请记住,SSR 缓存仅适用于开发服务器(除非您设置自己的生产服务器)并且仅适用于 React 页面。不是 api 调用。这只是 nodejs 的行为。我认为您的脚本没有任何问题(除了您没有显示任何更改 processing 的代码并且您没有显示 someAsyncTask 函数是什么。
  • @brandon 我看到的行为是在某些时候脚本正在重新加载,并且运行时间较长的后台任务被取消而没有回调。 -- 可能只是开发环境的问题?
  • 您必须显示someAsyncTask。函数停止运行的唯一方法是重新启动 nodejs 进程(我想这可能正在发生)。

标签: javascript express next.js


【解决方案1】:

如果您的 API 调用超时,那么这实际上意味着您的 Node/Express 服务器正在超时您的 API 请求。您可以使用以下代码增加默认超时时间

var server = app.listen();
server.setTimeout(10 * 60 * 1000);

如果它们是非常长时间运行的任务,那么您可以使用 socket.io 或长轮询技术来探索使用 WebSockets。

【讨论】:

  • 我认为这是调用结果处理程序的超时时间对吗?在这种情况下,我想立即返回,但继续处理我运行时间较长的“渲染”任务。
【解决方案2】:

api 文件夹中的任何内容都是“函数”脚本,由 AWS Lambda 处理。这些通常是短暂的,但由于成本,Next.is 会限制它们。它们也有可能通过 API 网关运行,该网关也有最大超时时间。

【讨论】:

  • 就我而言,我是自托管的,而不是 Next.is。虽然这个答案可能与该服务上的人相关:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 2014-10-26
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多