2017-10-24 16 views
0

私はウェブサイトからデータを抽出しようとしています。データが変更されたかどうかを確認するために10分後にループしたいと思います。私はモジュールで自分の関数を詰め込むことは良い考えだと思っていましたが、今はログインモジュールからデータモジュールへの私の現在の悪夢のインスタンスを手に入れました。悪夢をモジュール化して悪夢のインスタンスを渡す

start.js

var config = require('./config.json'); 
var login = require('./functions/login.js'); 
var data = require('./functions/data.js'); 
var vo = require('vo'); 

var Nightmare = require('nightmare'), 
nightmare = new Nightmare({ 
    show: config.nightmare.show, 
    typeInterval: config.nightmare.typeInterval, 
    webPreferences: { 
     images: config.nightmare.images, 
    } 
    }); 

vo(login.login)(nightmare, function (err, result) { 
    if (!result) return; 
    console.log('Logged in as ' + config.user.username) 
    vo(data.getData)(nightmare, function (err, result) { 
    console.log(result); 
    }) 
}) 

login.js

var config = require('../config.json'); 
var Nightmare = require('nightmare') 

function* login(nightmare) { 
    return yield nightmare 
     .goto('http://example.com/') 
     .click('.gogo').wait(2500) 
     .insert('.whsOnd', config.user.username) 
     .click('.RveJvd').wait(2500) 
     .insert('.whsOnd', config.user.password) 
     .click('.RveJvd').wait(4000) 
     .then(() => { 
      return true; 
     })   
} 
//login works 

module.exports = { 
    login: login 
} 

data.js

var config = require('../config.json'); 
var Nightmare = require('nightmare') 

function* getData(nightmare) { 
    console.log('Getting data ...' + nightmare) 
    return yield nightmare   
     .click('.index_menu').wait(1000) 
     .evaluate(()=>{ 
      // do stuff 
     })      
     .then((result) => { 
      return result; 
     }) 
     .catch((error) => { 
      console.log('Failure: ' + error) 
     }) 
} 

module.exports = { 
    getData: getData 
} 

私は関数は、唯一の問題をされた作業悪夢イマイチundefindedもかかわらことをされている評価しますdata.jsには、例えばパスがあります。

+0

を... – Salketer

+0

その後、私はどのように行いますこれを使って? – jonasdero

+0

実際に言うことはできません...しかし、ちょうどreadmeを見て...最初のことは、コールバックだけで使用して、あなたが使用していない間に戻り値を関数として直接呼び出すことです2つのパラメータ...これはそれを行う方法かもしれない、私はちょうどそれが通常の方法だとは思わない。 – Salketer

答えて

0

別のナイトメアインスタンスを作成しました。彼らは同じクッキーセッションを共有しないので、ログインセッションはgetdataインスタンスに反映されません。ログイン・インスタンスからCookieを渡して、getdataインスタンスに設定することができます。

login.js私はそれについて、あなたの使用が完全に間違っていると思われるビットを読んで、VO知りませんでした

  nightmare 
      .goto('http://example.com/') 
      .click('.gogo').wait(2500) 
      .insert('.whsOnd', config.user.username) 
      .click('.RveJvd').wait(2500) 
      .insert('.whsOnd', config.user.password) 
      .click('.RveJvd').wait(4000) 
      .cookies.get() 
      .then((cookie) => { 
       return cookie; // pass this cookie to getdata 
      })  

data.js

nightmare 
    .cookies.set(cookies) //set cookies from login session 
    .click('.index_menu').wait(1000) 
    .evaluate(()=>{ 
       // do stuff 
      })      
    .then((result) => { 
      return result; 
      }) 
    .catch((error) => { 
      console.log('Failure: ' + error) 
      }) 
    } 
関連する問題