2016-12-10 2 views
1

У меня есть функция, которая считывает данные с веб-страницы и публикует ее в консоли, но я хочу вернуть данные, которые я прочитал, и сделать что-то еще с ней. Так что вместо console.log (температура) я хочу вернуть значение температуры и сделать console.log (загрузить (url)), но он «undefined».Возвращает значение функции Node.js

//require https module 
var https=require("https"); 
//require cheerio to use jquery-like and return a DOM tree 
var cheerio=require('cheerio'); 
var global=""; 
//a function with url and callback par which connects to URL API and read the data 
module.exports.download=function(url){ 
    //read the data\ 
    https.get(url,function(res){ 
    var data=""; 
    //add it to the data string 
    res.on('data',function(chunk){ 
     data+=chunk; 
    }); 
    //parse it with a callback function 
    res.on('end',function(){ 
     var $=cheerio.load(data); 
     var temperature=$("span.temp.swip").text(); 
    console.log(temperature); 
    }); 
    }).on('error',function(err){ 
    console.log(err.message) 
    }); 
} 

//chose the url to connect 
var Ploiesti='44.9417,26.0237'; 
var Brasov='45.597,25.5525'; 
var url='https://darksky.net/forecast/' + Ploiesti + '/si24/en'; 

//download(url); 
+0

Вы должны сделать это внутри 'res.on («конец»)' обратного вызова –

+0

, что, как я, ве сделал вместо console.log (темпера ture) Я возвращал температуру и после того, как в конце я сделал console.log (скачать (url)), и он напечатал unifined –

+0

Этот вопрос был задан буквально сотни раз. Вы должны научиться программировать с асинхронными результатами в Javascript. Дубликат выше дает вам много вариантов для этого. – jfriend00

ответ

0

Так что вам нужен обратный вызов, чтобы присвоить переменные к нему и получить из любой точки мира, посмотреть на cb:

var download = function(url, cb){ 
    //read the data\ 
    https.get(url,function(res){ 
    var data=""; 
    //add it to the data string 
    res.on('data',function(chunk){ 
     data+=chunk; 
    }); 
    //parse it with a callback function 
    res.on('end',function(){ 
     var $=cheerio.load(data); 
     var temperature=$("span.temp.swip").text(); 
     cb(temperature); 
    }); 
    }).on('error',function(err){ 
    console.log(err.message) 
    }); 
} 

module.exports.download = download; 

Тогда, если вам нужно вызвать функцию из Интернета вам нужен маршрут, использовать Экспресс и сохранить предыдущий файл как download.js

var express = require('express'), 
    app = express(), 
    download = require('download.js'); 

app.get('/temperature', function (req, res) { 
    // Get the temp 
    var Ploiesti='44.9417,26.0237', 
     Brasov='45.597,25.5525', 
     url='https://darksky.net/forecast/' + Ploiesti + '/si24/en'; 

    download.download(url, function (temp) { 
    // Send the response to the web 
    res.json({ temperature: temp); 
    }); 
}); 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!') 
}); 
+0

Хорошие ответы должны содержать текстовое объяснение того, как вы решили проблему OP в дополнение к вашему коду. Этот ответ не содержит пояснений и прямо сейчас требует от кого-то визуального разграничения между вашим кодом и кодом OP, чтобы попытаться выяснить, что вы изменили. – jfriend00

+0

yes Я сделал это, и он работает, но я не хочу публиковать температуру на консоли. Я хочу сохранить ее в переменной или объекте, а после ее передачи и опубликовать на веб-странице, поэтому мне нужно извлечь переменная температура от этой функции –

+0

Если вам это нужно на веб-странице, вам нужно создать маршрут для node.js и функцию загрузки, которую нужно вызывать из Интернета. Затем вы можете ответить на звонок с температурой. Посмотрите на Express, чтобы сделать это http://expressjs.com/en/starter/hello-world.html –

Смежные вопросы