Остановка функции на узловом сервере из интерфейса

#node.js

#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) }
        });
    }
})
  

Я планировал отправить вызов API с running = false, чтобы остановить его, но, похоже, это не работает, это просто создает другой поток

Ответ №1:

Ваш подход работает, с несколькими улучшениями и изменениями в логике:

  • Вы должны сравнить с ‘false’ вместо false или проанализировать / вычислить строку запроса.
  • Областью действия вашей timer переменной должен быть весь веб-процесс. Если вы объявите ее внутри функции, вы потеряете ссылку на нее, чтобы использовать ее позже в 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/ и вместо timer переменной иметь сопоставление с переменной timer для каждого пользователя. С уважением!

Комментарии:

1. Спасибо за ответ, это правда, что я должен рассматривать false как строку, мне также нравится идея добавления пользователя в path, таким образом, я могу настроить таргетинг на конкретные конечные точки