Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从前端停止节点服务器中的函数_Node.js - Fatal编程技术网

Node.js 从前端停止节点服务器中的函数

Node.js 从前端停止节点服务器中的函数,node.js,Node.js,我正在构建这个应用程序,每个用户都可以在我的node.js服务器上执行一个函数,这个函数是一个循环,它会持续运行并更新数据库。我的目标是找到一种方法来停止用户执行的函数,让您了解我已经实现的逻辑。请参阅下面的代码: app.get('/api/v1/', cors(), (request, response) => { let timer = setInterval(apiCall, interval); if (request.query.running === fals

我正在构建这个应用程序,每个用户都可以在我的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调用来停止它,但它似乎不起作用,它只是创建了另一个线程。您的方法很有效,在逻辑上有一些改进和更改:

  • 您应该比较“false”而不是false,或者分析/评估 质询
  • 您的
    计时器
    变量的作用域应该是整个web进程。如果在函数中声明它,则会丢失它的引用,以便稍后在
    clearInterval
    中使用它
  • 您的
    setInterval
    必须在else子句中,否则您将取消它并在同一调用中再次启动它
  • 您的示例没有定义
    interval
    变量。我改了2秒
如果改变了这一点,您的示例将起作用。请查看:

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/
,并为每个用户创建一个带有计时器变量的映射,而不是
计时器变量。问候

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

  • 您应该比较“false”而不是false,或者分析/评估 质询
  • 您的
    计时器
    变量的作用域应该是整个web进程。如果在函数中声明它,则会丢失它的引用,以便稍后在
    clearInterval
    中使用它
  • 您的
    setInterval
    必须在else子句中,否则您将取消它并在同一调用中再次启动它
  • 您的示例没有定义
    interval
    变量。我改了2秒
如果改变了这一点,您的示例将起作用。请查看:

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/
,并为每个用户创建一个带有计时器变量的映射,而不是
计时器变量。问候

感谢您的回复,我确实应该将false视为字符串,我也喜欢将用户添加到路径的想法,dat方式我可以针对特定端点感谢您的回复,我确实应该将false视为字符串,我也喜欢将用户添加到路径的想法,dat方式我可以针对特定端点