2016-07-17 7 views
0

Ich mache eine HTTPS-Anfrage an eine API (wrike.com) und alles funktioniert, außer ich habe Mühe, das Ergebnis meiner Ansicht zu übergeben, um im Frontend anzuzeigen.NodeJS übergibt Ergebnisse HTTPS-Anfrage an die Ansicht

Dies ist der Funktionscode:

module.exports.getWrikeFolder = function(user, callback) { 
User.findOne({email: user}, function(err, doc){ 
if(err) throw err; 
var accessToken = doc.wrikeaccess; 
console.log(accessToken); 

var data = querystring.stringify({ 
    "descendants": true, 
    "project": false 
}); 

var options = { 
    host: 'www.wrike.com', 
    method: 'GET', 
    path: '/api/v3/folders/', 
    headers: { 
    'Content-Type': 'application/x-www-form-urlencoded', 
    'Authorization': 'bearer ' + accessToken 
    } 
} 

var folders = []; 

var request = https.request(options, function(res) { 
    res.on('data', function (chunk) { 
    folders.push(chunk); 
    }).on('end', function() { 
    folders = Buffer.concat(folders).toString(); 
    console.log(folders); 
    }); 

}); 

request.on('error', function(e) { 
    console.log('problem with request: ' + e.message); 
}); 

request.write(data); 
request.end(err, folders); 
}); 
} 

Und dies ist der Code für die Route:

router.get('/dmd', ensureAuthenticated, function(req, res, next) { 
wrike.getWrikeFolder(user, function(err, folders) { 
    //if(err) throw err; 
    res.render('dmd-codes', { 
     title: 'DMD Codes', 
     nav: 'Admin', 
     folders: folders 
    }); 
    }); 
}); 

Ich weiß, dass die Funktion arbeitet wie die console.log(folders); Linie das erwartete Ergebnis in der Konsole zeigt. Was fehlt mir, um das Ergebnis in die Route zu bekommen.

Danke für jede Hilfe.

Antwort

1

Sieht aus, als würden Sie nie Ihre callback in dem Modul ausführen, das die http-Anfrage an die API ausführt, was bedeutet, dass res.render() nicht ausgeführt werden würde. Versuchen Sie, die Ausführung von callback innerhalb von getWrikeFolder():

module.exports.getWrikeFolder = function(user, callback) { 
    User.findOne({email: user}, function(err, doc){ 
    // if(err) throw err; // NOOOO! Use callbacks ;) 
    if (err) return callback(err); 

    // ... (your code) 

    var request = https.request(options, function(res) { 
     res.on('data', function (chunk) { 
     folders.push(chunk); 
     }).on('end', function() { 
     folders = Buffer.concat(folders).toString(); 
     console.log(folders); 

     // make sure to execute callback! 
     callback(null, folders); 

     }); 

    }); 

    request.on('error', function(e) { 
     console.log('problem with request: ' + e.message); 
     // don't forget to use the callback!! 
     return callback(new Error('problem with request: ' + e.message)); 
    }); 

    request.write(data); 
    request.end(err, folders); 
    }); 
} 
+0

so toll gearbeitet. Danke für die Hilfe. –

+0

kein Problem! Vergessen Sie nicht diese Rückrufe in Knoten !! Denken Sie daran, dass fast alles asynchron ist. – jakerella

+0

Hallo Jerkerella, das übergibt die Variable nicht als Array. Ich habe versucht, 'toString()' weg von der Funktion zu nehmen, aber das tut es auch nicht. Könntest du mir sagen, wie ich das in ein Array umwandeln kann, damit ich in meiner Ansicht eine for-Schleife machen kann, um die Daten in einer Reihenfolge anzuzeigen? Nochmals vielen Dank für jede Hilfe, die Sie geben können. –

Verwandte Themen