2017-11-20 3 views
0

Ich versuche jede mögliche Lösung, die in SO verfügbar ist. wie mit global oder mit bind, aber kann nicht auf die globale Variable zugreifen. Hier ist mein Code, den ich versuche in nodejs zu erzeugen, hier ist meine .js Datei.globale Variable in Nodejs

module.exports = function (portal) { 
    var mongoose = require('mongoose'); 
    var News = mongoose.model('News'); 
    var urls =""; 
    var gensitemap = function(){ 
    urls = "abc"; 

    console.log(urls);// print abc as expected 
    News.find().exec(function (err, news) { 
     news.forEach(function (t) { 
     urls += "<url><loc>"+cdn_url+"/news"+t.slug+"</loc>"+"</url>"; 
     }); 
    }); 
    console.log(urls);// print still abc as not expected it should be change 
    } 
    var allUsers = portal.setupContext({}); 
    app.get('/gensitemap',allUsers ,gensitemap); 
    }; 

hier können Sie i url Variable vor dem und nach News.find() nachschauen method.but stattdessen die URL der Änderung seines gleichen Ausgabe gedruckt wird.

Jede Idee, die ich bereits versuche global oder async.parallel({}) aber das gleiche Problem in News.find() Knoten js behandeln diese Variable als anders.

Irgendwelche Hilfe?

UPDATE:

Nachdem die Kommentare und einige der Erwähnung Frage zu lesen ich versuche, diesen

Events.find().exec(function (err1, events) { 
      events.forEach(function (t1) { 
       url += "<url><loc>"+cdn_url+"/event"+t1.slug+"</loc>"+changefreq+priority+"</url>"; 
      }); 
      News.find().exec(function (err2, news) { 
        news.forEach(function (t2) { 
         url += "<url><loc>"+cdn_url+"/news"+t2.slug+"</loc>"+changefreq+priority+"</url>"; 
        }); 
        var static_urls = ['about-us','categories','overview','media','contact-us','login','register','pages/en/faq']; 
          for(var i = 0 ;i < static_urls.length;i++){ 
           url += "<url><loc>"+"http://192.168.10.38:3000/"+static_urls[i]+"</loc>"+"<changefreq>weekly</changefreq>"+"<priority>1</priority>"+"</url>"; 
          } 
        console.log(url); 

//this url(variable) print only the changes i made in above for loop.. :-(
       }); 
     }); 

ich auch feststellen, nachdem er einige Zeit warten, ich bin in der Lage, die Veränderung zu sehen, aber sie sind nicht in der gleichen Reihenfolge.

+3

Mögliches Duplikat von [Wie die Antwort von einem asynchronen Aufruf zurückkehren?] (Https://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous- Anruf) – baao

+0

versuchen Sie, diesen Link und slove Qution; https://stackoverflow.com/questions/10987444/how-to-use-global-variable-in-node-js –

+0

aber meine Variable sind in der gleichen Datei @DharmikUnagar –

Antwort

1
module.exports = function (portal) { 
    var mongoose = require('mongoose'); 
    var News = mongoose.model('News'); 
    var urls =""; 
    var gensitemap = function(){ 
    urls = "abc"; 

    console.log(urls);// print abc as expected 
    News.find().exec(function (err, news) {//this block of code gets executed after the News.find().exec() function return . Anything you want to do after the exec function call get a response you have to do it here. inside this call back function. 

     news.forEach(function (t) { 
     urls += "<url><loc>"+cdn_url+"/news"+t.slug+"</loc>"+"</url>"; 
     }); 
     //if you log the url here you should find ur desired value 
     console.log(urls); 
    }); 
    //This is getting called before your News.find().exec() function returns any value. 
    console.log(urls);// print still abc as not expected it should be change 
    } 
    var allUsers = portal.setupContext({}); 
    app.get('/gensitemap',allUsers ,gensitemap); 
    }; 
+0

Schau, ich stimme in der 'News.find()' Callback Ich bekomme meine Lust aus, aber ich habe mehr 3 andere Anruf wie 'News.find()' dann, was ich tun soll? –

+0

hängt davon ab, wie Sie sie verwenden möchten. Sie können diese Pakete betrachten. https://www.npmjs.com/package/async oder http: // bluebirdjs.com/docs/getting-started.html –

+0

Oder der klassische ES6 [Versprechen] (https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Promise) – Techniv