Я новичок в NodeJS, у меня работает микросервис, и я хочу открыть веб-страницу без браузера, чтобы делать запросы api на стороне клиента каждые 20 секунд. Я пытаюсь использовать пакет openurl
const openPage = require("openurl");
function openUpPage(url){
openPage.open(url);
}
setInterval(openUpPage("myURl"), 20000);
Однако мне возвращается «TypeError: аргумент обратного вызова должен быть функцией» при вызове setInterval(...).
Есть идеи, как это сделать с помощью setInterval?
Вы запускаете openUpPage("myURl") и устанавливаете то, что он возвращает, в setInterval. Поскольку он ничего не возвращает, ваш вызов в основном. setInterval(undefined, 20000); Не имеет отношения к проблеме, но ваш код не будет выполняться с интервалом.
@Luca В реализации open в пакете openurl указано, что обратный вызов является необязательным. Итак, я предположил, что ошибка возникает на setInverval.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно передать обратный вызов setInterval вместо того, чтобы сразу вызывать вашу функцию, используя в качестве примера анонимную стрелочную функцию.
setInterval(() => openUpPage("myURl"), 20000);
Однако стрелочная функция не обязательна.
setInterval(function() { openUpPage("myURl") }, 20000);
При тестировании я выяснил, что ошибка "TypeError: "callback" argument must be a function", выдаваемая setInverval, связана с node.js. Фрагмент кода из вопроса запускается без ошибок в коде (с использованием Chrome).
Это вызвано тем, что чистый javascript не может реализовать такие функции, связанные с таймером, из-за отсутствия поддержки низкого уровня. Поэтому браузеры и node.js не обязательно используют одну и ту же реализацию, как показано в документации.
Несмотря на то, что сразу вызывать функцию, как видно из фрагмента вопросов, бессмысленно в сочетании с setInterval, независимо от реализации.
@epascarello На основании опубликованного фрагмента setInterval - единственный вызов, который может вызвать эту ошибку, не так ли? Реализация open в пакете openurl заявляет, что обратный вызов является необязательным. Обновлено: первоначальный комментарий удален!
Привет, Дэвид! Спасибо за ответ. Я попробовал ваш код, но все еще получаю сообщение об ошибке events.js: 183 throw er; // Необработанное событие 'error' Ошибка: порождение xdg-open ENOENT в _errnoException (util.js: 1022: 11) в Process.ChildProcess._handle.onexit (internal / child_process.js: 190: 19) в onErrorNT (internal / child_process .js: 372: 16) в _combinedTickCallback (internal / process / next_tick.js: 138: 11) в process._tickCallback (internal / process / next_tick.js: 180: 9)
@Daniel Похоже, что-то вызвано пакетом child_process node.js. Без кода трудно сказать, в чем причина. Но не похоже, что проблема в setInterval. Итак, я думаю, что первоначальный вопрос был решен, поэтому вам следует создать еще один вопрос.
Где у вас ошибка? Я предполагаю, что внутри функции
openUpPage?