2016-08-01 20 views
0

Ich bin ein CS-Student mit einem starken Java-Hintergrund, und Javascript ist eine herausfordernde aber lustige Erfahrung, bis ich in die Situation geriet, wo ich versuchte, meine eigenen Module zu verwenden um Werte zurückzugeben, die erfordern, dass das Programm auf den Abschluss einer Prozedur wartet, bevor es zurückkehrt. Wie man Knotenmodule richtig benutzt


Bis jetzt konnte niemand aus irgendeinem Forum, in dem ich diese Frage gestellt habe, einen tatsächlichen Code-Fix zu dem Problem geben, sie haben mich angewiesen, weiteres Material zu lesen, das nicht mit dem Problem zu tun hat.
Würde jemand bitte den Code lesen und eine funktionierende korrekte Standardlösung für das Problem bereitstellen, vor dem ich stehe? Hier ist der Code, eine einfache Knoten-Server-Anwendung, app.js und ein Wettermodul, weatherApp.js, das eine vom Benutzer bereitgestellte Postleitzahl verwendet und eine Wettervorhersage in der Umgebung zurückgibt.

hier ist der Code:
weatherApp.js

// The required modules. 
var http = require("http"); 
var https = require("https"); 


    //result object 
    var resultSet = { 
     googleRequestUrl:"", 
     forecastIOrequest:"", 
     latitude :"", 
     longitude:"", 
     localInfo:"", 
     weather:"", 
     humidity:"", 
     pressure:"", 
     time:"" 
    }; 

    //print out error messages 
    function printError(error){ 
     console.error(error.message); 
    } 

    //Forecast API required information: 
    //key for the forecast IO app 
    var forecast_IO_Key = "bb9aac7c57877f8f5fab339e3b55669a"; 
    var forecast_IO_Web_Adress = "https://api.forecast.io/forecast/"; 


    //Create Forecast request string function 
    function createForecastRequest(latitude, longitude){ 
     var request = forecast_IO_Web_Adress + forecast_IO_Key + "/" 
          + latitude +"," + longitude; 
     return request; 
    } 

    //Google GEO API required information: 
    //Create Google Geo Request 
    var google_GEO_Web_Adress = "https://maps.googleapis.com/maps/api/geocode/json?address="; 

    function createGoogleGeoMapRequest(zipCode){ 
     var request = google_GEO_Web_Adress+zipCode + "&sensor=false"; 
     return request; 
    } 


    // 1- Need to request google for geo locations using a given zip 
    function connectToGoogleGEO(zipCode, afterCallback){ 
     var googleRequest = https.get(createGoogleGeoMapRequest(zipCode), function(response){ 
      //saving the Google request URL 
      resultSet.googleRequestUrl = createGoogleGeoMapRequest(zipCode); 
      var body = ""; 
      var status = response.statusCode; 
      //a- Read the data. 
      response.on("data", function(chunk){ 
       body+=chunk; 
      }); 
      //b- Parse the data. 
      response.on("end", function(){ 
       if(status === 200){ 
        try{ 
         var googleReport = JSON.parse(body); 
         resultSet.latitude = googleReport.results[0].geometry.location.lat; 
         resultSet.longitude = googleReport.results[0].geometry.location.lng; 

      resultSet.localInfo = googleReport.results[0].address_components[0].long_name + ", " + 
            googleReport.results[0].address_components[1].long_name + ", " + 
            googleReport.results[0].address_components[2].long_name + ", " + 
            googleReport.results[0].address_components[3].long_name + ". "; 
            // callback to forecast IO. 

         afterCallback(resultSet.latitude, resultSet.longitude); 
        }catch(error){ 
         printError(error.message); 
        }finally{ 
        // nothing here 
        } 
       }else{ 
        printError({message: "Error with GEO API"+http.STATUS_CODES[response.statusCode]}) 
       } 
      }); 
     }); 
    } 

    function connectToForecastIO(latitude,longitude){ 
     var forecastRequest = https.get(createForecastRequest(latitude,longitude),function(response){ 
      resultSet.forecastIOrequest = createForecastRequest(latitude,longitude); 
      var body = ""; 
      var status = response.statusCode; 
      //read the data 
      response.on("data", function(chunk){ 
       body+=chunk; 
      }); 
      //parse the data 
      response.on("end", function(){ 
       try{ 
        var weatherReport = JSON.parse(body); 
        resultSet.weather = weatherReport.currently.summary; 
        resultSet.humidity = weatherReport.currently.humidity; 
        resultSet.temperature = weatherReport.currently.temperature; 
        resultSet.pressure = weatherReport.currently.pressure; 
        resultSet.time = weatherReport.currently.time; 
       }catch(error){ 
        printError(error.message); 
       }finally{ 
        console.log(resultSet); 

       } 
      }); 
     });  
    } 


    function get(zipCode){ 
     var results = connectToGoogleGEO(zipCode, connectToForecastIO); 
     return results; 
    } 

    //define the name of the outer module. 
    module.exports.get = get; 

Und hier ist der Server-Code:
app.js

var express = require("express"); 
var weatherApp = require("./weatherApp.js"); 
var path = require("path"); 
var http = require("http"); 
var app = express(); 

//creating routes 
//The home 
app.get("/", function(req, res){ 
    res.redirect("/weather"); 
}); 
app.get("/weather", function(req, res){ 
    res.sendFile(path.join(__dirname + "/index.html")); 
}); 
//------------------------------------------------------ 
//The resources, css, web js files, images etc. 
app.get("/StyleSheets/style.css", function(req, res){ 
    res.sendFile(path.join(__dirname + "/StyleSheets/style.css")); 
}); 
app.get("/webScripts/app.js", function(req, res){ 
    res.sendFile(path.join(__dirname + "/webScripts/app.js")); 
}); 
app.get("/webImages/swirl_pattern.png", function(req, res){ 
    res.sendFile(path.join(__dirname + "/webImages/swirl_pattern.png")); 
}); 
//------------------------------------------------------- 
//other requests 

app.get("/zipcode.do", function(req, res){ 
    var zipcode = req.query["zipcode"]; 
    var response = "No report Available"; 

    function getReport(zipCode, callback){ 
     response = weatherApp.get(req.query["zipcode"]); 
    } 
    getReport(zipcode,()=>{ 
     res.send("<p>" + response+ "</p>"); 
    }); 
}); 

//any other entry thats not listed as a valid to request 
app.get("/:title", function(req,res){ 
    var title = req.param.title; 
    if(title === undefined){ 
     var status = res.status(503); 
     res.send("This page does not exists" + '"' + http.STATUS_CODES[503] + '"'); 
    }else{ 
     res.send(title); 
    } 
}); 

app.listen(3000, function(){ 
    console.log("Server running at port: 3000") 
}); 


Das Hauptproblem I Bin gerade jetzt ist:

  1. Das Programm gibt nichts vom Modul zurück, selbst wenn die finale console.log im Wettermodul das richtige resultSet-Objekt druckt.
  2. Der Server wartet nicht auf die Rückgabe des Moduls und druckt weiterhin keine Daten.

Kann jemand eine Arbeits Fix eines dieser Probleme bieten würde ich wirklich dankbar sein, Das ist mein Fortschritt wirklich behindert hat und aufgeschlüsselt meine Moral ein wenig :(

Antwort

0

Ihr Problem ist, dass Sie asynchron verwenden . Funktionen, als ob sie synchron waren

Es könnte hier nicht das einzige Problem sein, aber diese Funktion ist besonders problematisch:

function get(zipCode){ 
    var results = connectToGoogleGEO(zipCode, connectToForecastIO); 
    return results; 
} 

connectToGoogleGEO() Anrufe the asynchronous https.get() function und gibt die Daten, die von Google abgerufen werden, nicht zurück. Sie müssen Ihren Code neu schreiben, damit er nicht erwartet, dass die Daten von der Funktion zurückgegeben werden. Stattdessen müssen Sie einen Rückruf übergeben, der die Daten verarbeitet.

Achten Sie darauf, wann Sie asynchrone Funktionen aufrufen und wie ihre Rückrufe funktionieren. Dies ist wichtig, wenn Sie mit Node.js

arbeiten