Cron и кошмары

Я не могу запустить свой cron с кошмаром.

Первая итерация функции get_data() работает отлично, но после этого cron перезапускается, и функция больше не запускается.

Также никогда не регистрируется «сканирование завершено».

Вы знаете, что не так с моим кодом?

Журналы

1
cron
data fetched
2
cron
3
cron

-

var Nightmare = require('nightmare')
var nightmare = Nightmare({
  typeInterval: 300,
  show: true,
  executionTimeout: 120000,
  gotoTimeout: 120000
});
let data = ""

-

var get_data = function(){
  return new Promise(function(resolve, reject) {
    nightmare
    .goto('https://url.com')
    .type('[name=email]', '')
    .wait(1000)
    .type('[name=email]', 'myemail')
    .wait(1000)
    .type('[name=password]', '')
    .wait(1000)
    .type('[name=password]', 'mypassword')
    .click('[type=submit]')
    .wait(5000)
    .goto('https://url.com')
    .wait(25000)

    .evaluate(function (page, done) {

      return document.body.innerText
      done()
    })
    .end()
    .then(function (result) {
      data = result
    })
    .then(function(data){
      return fs.writeFile("./data.txt", data, function(err) {
        if(err) {
          console.log(err)
          reject(err)
        }
        resolve(data)
      });
    })
    .catch(function(error){
      reject(error)
    })
  })
}

-

var i = 0
var job = new CronJob('0 */20 * * * *', function() {
    ++i
    console.log(i)
    console.log("cron")
    get_data()
  }, function () {
    console.log("crawl ended")
  },
  true
);

job.start();

person Quentin Del    schedule 02.11.2016    source источник


Ответы (1)


Пара моментов, которые бросаются в глаза сразу.

.evaluate(function (page, done) {

      return document.body.innerText
      done()
    })

Это не будет делать то, что вы ожидаете, и, вероятно, никогда не вернется и не вызовет ошибку тайм-аута. Вы не передаете аргумент для page, что означает, что done будет неопределенным. Измените вышеуказанное на:

.evaluate(function (done) {

      return document.body.innerText
      done()
    })

Во-вторых, это:

.then(function(data){
      return fs.writeFile("./data.txt", data, function(err) {
        if(err) {
          console.log(err)
          reject(err)
        }
        resolve(data)
      });
    })

... переопределяет data. Я не думаю, что вы выводите переменную data, установленную в предыдущем случае, я думаю, что это всегда должно выводить undefined. Будьте осторожны с закрытиями.

В-третьих, и, пожалуй, самое главное:

.evaluate(function (page, done) {

      return document.body.innerText
      done()
    })
    .end() // <== this might be a problem
    .then(function (result) {
      data = result
    })

Поскольку nightmare определяется только один раз, вы завершаете единственный экземпляр, который у вас есть. Он не будет воссоздан и не будет работать должным образом, если вы попытаетесь выполнить действия над завершившимся экземпляром во второй итерации вашего цикла. Либо уберите .end() и переместите его в конец ваших скриптов, либо создайте новый экземпляр Nightmare для каждой итерации.

person Ross    schedule 20.11.2016