如何操作Twilio数据对象?的NodeJS

时间:2017-09-19 02:59:52

标签: javascript node.js express twilio

如何将变量'data'中的信息放入新变量'newData'?

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

代码工作正常。但是,我想操纵函数的外部

2 个答案:

答案 0 :(得分: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呼叫完成后运行。

答案 1 :(得分:0)

将其视为异步。基本上你的渲染在它具有回调内容之前进行渲染。