2017-01-19 5 views
0

Im Grunde versuche ich einige Daten von der Website zu verwerfen und die DOM-Extraktion, Löschung und Aktualisierung einer Rückruffunktion durchzuführen, die an das "end" -Ereignis gebunden ist von http.request.NodeJS http.request gibt keine Daten zurück, selbst nachdem die Rückgabe am "Ende" -Ereignis angegeben wurde

Ich habe die Daten aus dem 'end' Ereignis-Callback zurückgegeben, aber es empfängt nicht in meiner Route Callback-Funktion. Ich bekomme undefined dort.

Unten ist der Code-Block:

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"; 
     } 
    } 
}; 

Und hier ist die Routes.js Funktion:

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

In hier auch ich nicht den Wert von n bekommen.

Antwort

1

Ist Ihr 'var scraper' auch in der Datei route.js? Ich denke, es ist nicht und Sie können nicht auf diese andere js-Datei zugreifen, dafür verwenden Sie module.exports.

z.

// 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

Ich habe es auch exportiert .. Mein vollständiger Codeblock sieht wie folgt aus: 'var Schaber = {};' ' module.exports = Schaber. Aber es funktioniert nicht. – ChanX

1

Sie können keinen Wert aus einem asynchronen Rückruf zurückgeben. Nun, Sie können, aber es wird höchstwahrscheinlich ignoriert und wird sicherlich nicht tun, was Sie wollen.

Sie können nicht einmal ein Versprechen an diesem Ort zurückgeben. Sie können eine Zusage nur dort auflösen, wo Sie jetzt die Rückgabeanweisungen verwenden. Sie müssen eine Zusage von der Hauptfunktion zurückgeben und dann die Zusage in Ihren Ereignisprozeduren, in denen Sie jetzt Retouren verwenden, auflösen oder ablehnen. siehe

Für weitere Informationen, diese Antworten:

0

Die einfachste Modifikation, die diese Arbeit machen wird, ist eine Rückruffunktion extractEmail passieren zu erhalten die Daten, sobald sie fertig sind.

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')); 
     } 
    } 
}; 

Und es wie folgt verwenden:

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); 
    }); 
}); 
Verwandte Themen