2017-09-19 5 views
1

どのように変数 'data'の情報を新しい変数 'newData'に入れることができますか?どのようにTwilioデータオブジェクトを操作するには? 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}); 
}); 

上記のコードでは、 'newData'が定義されていません。

が行う場合は、この:

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

コードが正常に動作します。しかし、の外にデータを操作したいのですが、の機能です。

+0

にデータを送信します。コールバックを持っているか '' 'Promises''を使っている関数 – Wainage

+0

競合状態のような臭いがありますが、' client.messages.list() '関数の詳細を知らずにどうやって助けてくれるのか分かりません。 – JaeGeeTee

+0

なぜ関数外のデータを操作する必要がありますか? Twilioの 'list'関数はコールバック内のデータを返すので、呼び出した直後にデータを持つことはありません。 – gregnr

答えて

1
は、それが定義のコールバックに newDataの使用を移動

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 }); 
    } 
    }); 
}); 

問題は、コールバックが実行されるまでnewDataが移入されていませんが、あなたはそれが起こる前の値を使用しようとしているということです。

ここではどのような順序で何が起こるかを説明するコメントがあなたの元のコードです:

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 }); 
}); 

うまくいけば、あなたのres.renderコールがコールバックの内側に属し、なぜそれが明確になります。 listコールが完了した後に実行します。

0

非同期で対処します。基本的に、レンダリングはレンダリングされてからコールバックの内容を取得します。

関連する問題