2

我正在使用x-ray库来抓取特定网站的某些内容并将其保存在 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 分钟。

日志中没有错误,在我的测试过程中也没有意外重启。

也许这与我正在使用的库有关?我不知道是什么原因造成的。

4

2 回答 2

0

虽然不是一个确切的解决方案,但我将其发布为答案,因为它解决了这个问题,并且也结束了这个问题。

最终,我使用cron.

于 2016-05-03T13:32:44.017 回答
0

来自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();
于 2016-04-23T13:07:11.617 回答