2017-01-19 10 views
0

基本的に私はウェブサイトからデータを取り除き、 'end'イベントにバインドされたコールバック関数でDOMの抽出、削除、 http.requestNodeJS http.requestは 'end'イベントでreturnを指定してもデータを返さない

'end'イベントコールバックからデータを返しましたが、私のルートコールバック関数で受信していません。私はそこにundefinedを得ます。以下は

は、コードブロックです:

var scraper = { 
    extractEmail: function (directoryName) { 
     var result = getDirectory(directoryName); 
     if (result !== 404) { 
      var protocol = result.https ? https : http; 
      protocol.request({ 
       host: 'somevalue.net', 
       method: "GET" 
      }, function (res) { 
       var data = ''; 
       res.on('data', function (chunk) { 
        data += chunk; 
       }); 

       res.on('end', function() { 
        return data; 
       }); 
      }) 
       .on('error', function (err) { 
        return err; 
       }) 
       .end(); 
      //return data; 
     } 
     else { 
      //return "Failed"; 
     } 
    } 
}; 

そして、ここではRoutes.js機能である:ここで

app.get('/:directory', function (req, res) { 
    var n = scraper.extractEmail(req.params.directory); 
    console.log(n); 
    res.send(n); 
}); 

も、私はnの値を得ることはありません。

答えて

1

あなたの 'var scraper'はroute.jsファイルにもありますか? 私はそうではないと思います。他のjsファイルにアクセスすることはできません。 これはmodule.exportsを使用するためです。

例えば、

// module.js 
var name = "foobar"; 
// export it 
exports.name = name; 



Then, in route.js... 
>  //route.js 
>  // get a reference to your required module 
>  var myModule = require('./module'); 
>  //correct path to folder where your above file is 
>  // name is a member of myModule due to the export above 
>  var name = myModule.name; 
+0

..コードの私の完全なブロックは次のようになります。 'VARスクレーパー= {};' 'module.exportsは=スクレーパー '..しかし、それは動作していません。 – ChanX

1

非同期コールバックから値を返すことはできません。さて、あなたはすることができますが、それはほとんど無視され、最も確かにあなたが望むことをしません。

あなたはその場所で約束を返すことさえできません。 return文を使用する場合にのみ、約束を解決することができます。メイン関数から約束を返し、今すぐ返品を使用するイベントハンドラーで約束を解決または拒否する必要があります。詳細情報については

はそれらの答えを参照してください。

0

、この作業を行います最も簡単な修正を受信するextractEmailにコールバック関数を渡すことですいったん準備が整ったらデータ。

var scraper = { 
    extractEmail: function (directoryName, cb) { 
     var result = getDirectory(directoryName); 
     if (result !== 404) { 
      var protocol = result.https ? https : http; 
      protocol.request({ 
       host: 'somevalue.net', 
       method: "GET" 
      }, function (res) { 
       var data = ''; 
       res.on('data', function (chunk) { 
        data += chunk; 
       }); 

       res.on('end', function() { 
        cb(null, data); 
       }); 
      }) 
       .on('error', function (err) { 
        cb(err); 
       }) 
       .end(); 
     } 
     else { 
      cb(new Error('Failed')); 
     } 
    } 
}; 

そして、このようにそれを使用します。私もそれを輸出している

app.get('/:directory', function (req, res) { 
    scraper.extractEmail(req.params.directory, function(err, n) { 
     if (err) return console.error(err); 
     console.log(n); 
     res.send(n); 
    }); 
}); 
関連する問題