Тайм-аут узла.js не срабатывает

Я использую рентгеновскую библиотеку, чтобы почистить определенный веб-сайт для некоторого контента и сохранить его в файле JSON.

Я хотел бы получить статус каждый час, но Node не выполняет мой setTimeout,

Это мой код:

var db, record, x;
x = require('x-ray')();
db = require('lowdb')('rec.json', {
  storage: require('lowdb/file-async')
});

record = function() {
  console.log('will contact server');
  setTimeout(record, 60 * 60 * 1000);
  x('http://example.com', 'h1')(function(err, content) {
    console.log('server contacted');
    if (err) {
      console.log('error occurred');
      db('status').push({
        time: (new Date).toString(),
        status: err
      });
    } else {
      console.log('status recorded successfully');
      db('status').push({
        time: (new Date).toString(),
        status: content
      });
    }
  });
};
console.log('ready');

record();

Он регистрирует первый раз без каких-либо проблем, но после этого ничего не делает. Кажется, что record Функция выполняется только один раз.

я использую pm2 управлять процессом, pm2 list показывает, что он работает далеко за 60 минут. Даже если Node не может выполнить обратный вызов точно в заданное время, процесс был жив (дольше, чем я перезапустил его) около 80 минут.

В журналах нет ошибок и не было неожиданных перезапусков во время моего тестирования.

Может быть, это как-то связано с библиотеками, которые я использую? У меня нет идей, что может быть причиной этого.

2 ответа

Решение

Хотя это и не точное решение, я выкладываю это как ответ, так как это решает проблему, а также закрывает этот вопрос.

В конце концов, я решил это с помощью cron,

Из Документов LowDB:

Важный

Когда вы изменяете базу данных, Promise возвращается.

Когда вы читаете из базы данных, результат сразу возвращается.

Планирование выполнения функции внутри then обратный вызов должен работать:

var db, record, x;
x = require('x-ray')();
db = require('lowdb')('rec.json', {
  storage: require('lowdb/file-async')
});

record = function() {
  console.log('will contact server');
  x('http://example.com', 'h1')(function(err, content) {
    console.log('server contacted');
    if (err) {
      console.log('error occurred');
      db('status').push({
        time: (new Date).toString(),
        status: err
      }).then(function(status) {
        setTimeout(record, 60 * 60 * 1000);
      });
    } else {
      console.log('status recorded successfully');
      db('status').push({
        time: (new Date).toString(),
        status: content
      }).then(function(status) {
        setTimeout(record, 60 * 60 * 1000);
      });
    }
  });
};
console.log('ready');

record();
Другие вопросы по тегам