首页 > 解决方案 > 从前端停止节点服务器中的功能

问题描述

我正在构建这个应用程序,每个用户都可以在我的 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 调用来停止它,但它似乎不起作用,它只是创建了另一个线程

标签: node.js

解决方案


您的方法有效,但在逻辑上有一些改进和更改:

  • 您应该比较“假”而不是假,或者解析/评估查询字符串。
  • 您的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变量,而是为每个用户与计时器变量进行映射。问候!


推荐阅读