Cron и кошмар JS

Я пытаюсь запустить cron с кошмаром JS на местном уровне. К сожалению, у меня есть эта ошибка.

Unhandled rejection (<{"message":"navigation error","code":-...>, no stack trace)

Связанная проблема: Nightmare JS не работает

Мне было интересно, связано ли это с тем, что для кошмара требуется графический интерфейс?

Спасибо за вашу помощь,

РЕДАКТИРОВАТЬ

В моем cron у меня есть одна функция Promise, которая состоит из cron, за которой следуют обещания.

var job = new CronJob('* */10 * * * *', function() {
    crawl()
  }, function () {
    console.log("crawl ended")
  },
  true
);


job.start();

Вот как выглядит этот кошмар:

var Nightmare = require('nightmare');
var nightmare = Nightmare({
  typeInterval: 300,
  show: true
});

nightmare
  .goto('https://pageThatRequireToLoginThenDiplayJsonAsText.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(25000)
  .wait(25000)
  .evaluate(function (page, done) {

    document.documentElement
    done()
  })
  .end()
  .then(function (result) {
    // fs.writeFileSync('testOutput.json', JSON.stringify(result));
    console.log(JSON.stringify(result))
  })
  .catch(function (error) {
    console.error('failed:', error);
  });

Когда я запускаю функцию crawl без cron, она прекрасно работает.

2 ответа

Решение

Моя проблема была в настройках cron. Я бы лучше использовал

var job = new CronJob('* 10 * * * *', function() {
    crawl()
  }, function () {
    console.log("crawl ended")
  },
  true
);

Кроме того, мне пришлось переопределить настройки кошмара в мою функцию.

var get_data = function(){
  var Nightmare = require('nightmare');
  var nightmare = Nightmare({
    typeInterval: 300,
    show: true
  });
  nightmare
  .goto('https://pageThatRequireToLoginThenDiplayJsonAsText.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(25000)
  .wait(25000)
  .evaluate(function (page, done) {

    document.documentElement
    done()
  })
  .end()
  .then(function (result) {
    // fs.writeFileSync('testOutput.json', JSON.stringify(result));
    console.log(JSON.stringify(result))
  })
  .catch(function (error) {
    console.error('failed:', error);
  });
}

Вместо

var Nightmare = require('nightmare');
var nightmare = Nightmare({
  typeInterval: 300,
  show: true
});

var get_data = function(){
  nightmare
  .goto('https://pageThatRequireToLoginThenDiplayJsonAsText.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(25000)
  .wait(25000)
  .evaluate(function (page, done) {

    document.documentElement
    done()
  })
  .end()
  .then(function (result) {
    // fs.writeFileSync('testOutput.json', JSON.stringify(result));
    console.log(JSON.stringify(result))
  })
  .catch(function (error) {
    console.error('failed:', error);
  });
}

Хорошо, с самого начала я не уверен, прав ли я или нет, потому что у меня не слишком много опыта с этим, и вы не указали, что вы определили в своем кроне. Но из быстрого поиска, который я сделал, то, что вы предполагаете, является правильным. Когда вы используете cron ваши звонки сделаны из командной строки. Теперь Nightmare построен на Electron, который, в свою очередь, зависит от Chromium. Теперь из того, что я узнал здесь, у Electron может быть ошибка, которая вызывает таймаут каждый раз, когда страница мгновенно загружается в реальном браузере хрома. Итак, из того, что я понял, вашему приложению необходимо, чтобы Electron взаимодействовал с Chromium для правильной работы, а в вашем случае это не так. Прошу прощения за расплывчатость и, возможно, неправильно, но это лучшее, что я мог придумать с таким небольшим количеством информации.

Другие вопросы по тегам