2017-09-19 1 views
1

Wie kann ich die Info in Variable 'data' in die neue Variable 'newData' setzen?Wie manipuliere ich das Twilio-Datenobjekt? nodeJS

var accountSid = '12345'; 
var authToken = "12345"; 
var client = require('twilio')(accountSid, authToken); 

app.get("/results", function(req,res){ 
    var query = req.query.search 
    var newData; 

    // Retrieve list of messages 
    client.messages.list(query, function(err, data) { 
     if(err){console.log(err)} 
     else { 
     // Pass info into 'newData' 
     newData = data; 
     } 
    }); 

console.log(newData); 

res.render("results", {data: newData}); 
}); 

Der obige Code führt dazu, dass 'newData' nicht definiert ist.

Wenn dies zu tun:

 else { 
     // Render raw 'data' 
     res.render("results", {data: data}); 
     } 

Der Code funktioniert gut. Ich möchte jedoch die Daten außerhalb der Funktion manipulieren.

+0

Senden Sie die Daten an. Funktion, die einen Rückruf hat oder '' 'Promises''' verwendet – Wainage

+0

Riecht wie eine Race-Bedingung, aber ich bin mir nicht sicher, wie ich helfen kann, ohne mehr über die' client.messages.list() '-Funktion zu wissen. – JaeGeeTee

+0

Warum müssen Sie die Daten außerhalb der Funktion bearbeiten? Da Twilios Funktion 'list' Daten in einem Callback zurückgibt, haben Sie die Daten nie unmittelbar nach dem Aufruf. – gregnr

Antwort

1

Ihre Benutzung newData in den Rückruf bewegen, wo es definiert ist:

app.get("/results", function (req,res){ 
    var query = req.query.search 
    var newData; 

    // Retrieve list of messages 
    client.messages.list(query, function (err, data) { 
    if (err) { console.log(err); } 
    else { 
     newData = data; 
     res.render("results", { data: newData }); 
    } 
    }); 
}); 

Das Problem ist, dass newData wird der Rückruf läuft nicht aufgefüllt werden, bis, aber Sie versuchen, den Wert zu verwenden, bevor das passiert .

Hier ist Ihr Original-Code mit Kommentaren zu erklären, was in welcher Reihenfolge passiert:

app.get("/results", function (req,res){ 
    // 1. This code runs first. 
    var query = req.query.search 
    var newData; 

    // 2. This call is made second. 
    client.messages.list(query, function (err, data) { 
    // 5. This code runs fifth, after the list call has completed. 
    if (err) { console.log(err); } 
    else { 
     // Pass info into 'newData' 
     newData = data; 
    } 
    }); 

    // 3. This console.log is third. 
    console.log(newData); 

    // 4. This runs fourth, at which point the HTTP response has been sent. 
    res.render("results", { data: newData }); 
}); 

Hoffentlich macht deutlich, warum Ihr res.render Anruf gehört innerhalb des Rückrufs. Sie möchten, dass es ausgeführt wird, nachdem der list-Aufruf abgeschlossen wurde.

0

Angebote mit Async. Grundsätzlich rendert Ihr Rendering, bevor es den Inhalt des Callbacks hat.

Verwandte Themen