Javascript node.js超时未触发

Javascript node.js超时未触发,javascript,node.js,settimeout,x-ray,Javascript,Node.js,Settimeout,X Ray,我正在使用这个库从一个特定的网站中获取一些内容,并将其保存在一个JSON文件中 我希望每小时获取一次状态,但节点不执行我的setTimeout 这是我的代码: var db, record, x; x = require('x-ray')(); db = require('lowdb')('rec.json', { storage: require('lowdb/file-async') }); record = function() { console.log('will conta

我正在使用这个库从一个特定的网站中获取一些内容,并将其保存在一个JSON文件中

我希望每小时获取一次状态,但节点不执行我的
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列表
显示它的运行时间远远超过了60分钟。即使节点无法在给定的时间内准确执行回调,该进程仍保持活动状态(最长,在我重新启动它之前)约80分钟

日志中没有错误,测试期间也没有意外的重新启动

也许这和我使用的图书馆有关?我不知道是什么原因造成了这种情况。

来自:

重要的

修改数据库时,将返回一个承诺

当您从数据库中读取时,结果会立即返回

然后
回调中安排函数执行应该有效:

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();
虽然不是一个精确的解决方案,但我将此作为一个答案发布,因为它解决了问题,也结束了这个问题


最后,我使用
cron

解决了这个问题,我将尝试这个方法,如果它有效,我将接受答案。在承诺上总是有一个
然后
很重要吗?我认为这是没有必要的,或者我错过了什么?仍然没有工作。过程长达8小时,0次重新启动(我启动并离开家)<代码>记录
功能仍然只执行了一次。我遇到了类似的问题,但对我来说,超时似乎在一段时间后停止工作。我是否理解它只打印“将与服务器联系”一次,以后再也不会打印?或者它只是从未向数据库中插入任何内容?它将状态记录到数据库中,但只记录了一次。除了超时之外,整个事情都按计划进行。函数只执行一次,以后再也不会执行。然而,正如我在回复中提到的,我只是使用了cron并稍微修改了代码。不过,在您的情况下可能不适用。是的,但是使用cron并不能改变超时行为怪异的事实。您使用的是哪个版本的node?我相信它可能是5.8.0。