【发布时间】: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