node.js - 从前端停止节点服务器中的功能
问题描述
我正在构建这个应用程序,每个用户都可以在我的 node.js 服务器中执行一个函数,该函数是一个不断运行和更新数据库的循环。我的目标是找到一种方法来停止用户执行的功能,让您了解我已经实现的逻辑,请参见下面的代码:
app.get('/api/v1/', cors(), (request, response) => {
let timer = setInterval(apiCall, interval);
if (request.query.running === false) {
clearInterval(timer);
}
function apiCall(i) {
webshot(url, 'public/' + filename, options, function (err) {
if (err) { console.log(err) }
});
}
})
我打算发送一个带有 running=false 的 API 调用来停止它,但它似乎不起作用,它只是创建了另一个线程
解决方案
您的方法有效,但在逻辑上有一些改进和更改:
- 您应该比较“假”而不是假,或者解析/评估查询字符串。
- 您的
timer
变量的范围应该是整个 Web 进程。如果你在函数内部声明它,你会失去它的引用,以便稍后在clearInterval
. - 您
setInterval
必须在 else 子句中,否则您将取消它并在同一个调用中再次启动它。 - 您的示例没有定义
interval
变量。我换了2s。
更改后,您的示例有效。一探究竟:
var express = require('express');
var app = express();
var timer;
function apiCall(i) {
console.log("api called " + Date());
}
app.get('/api/v1/', (request, response) => {
if (request.query.running === 'false') {
clearInterval(timer);
console.log('Timer stopped');
} else {
console.log('Timer started');
timer = setInterval(apiCall, 2000);
}
response.send(200);
})
app.listen(3000);
当然这个解决方案有一个问题:它不会区分用户调用:这意味着如果多个用户调用你的 API 端点,他们都将与同一个计时器进行交互。如果您希望每个用户使用不同的计时器,则必须在 api 中添加逻辑以检测哪个用户拨打了电话,当然每个用户都有不同的计时器。最简单的方法是在 API 调用中添加一个名称:/api/v1/john/
,而不是一个timer
变量,而是为每个用户与计时器变量进行映射。问候!
推荐阅读
- c# - 在 KENDO Grid 中的 DATE 列字段上选择 FILTER(为 NULL 或为空)时
- csv - 从 CSV UNIX SH 中修剪顶部和底部行
- javascript - 使用谷歌脚本创建折线图 - 谷歌表作为数据源
- admin-on-rest - TypeError:翻译不是函数
- kubernetes - 试图了解法兰绒与法兰绒吊舱的用法
- hyperledger - 每次都处于挂起状态的交易
- amazon-dynamodb - 如何在 DynamoDB 中的单个查询中查询一个应该存在而另一个不应该存在于表中的条件
- .net - 如何使用 VB.NET 应用程序动态获取 AssemblyCustomAttribute 的值?
- android - ReactXP VirtualListView 未在 Android 上显示
- c# - 在鼠标处绘制一个矩形 C#