Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor:从Twilio获取短信列表并将其插入mongoDB_Javascript_Mongodb_Meteor_Twilio - Fatal编程技术网

Javascript Meteor:从Twilio获取短信列表并将其插入mongoDB

Javascript Meteor:从Twilio获取短信列表并将其插入mongoDB,javascript,mongodb,meteor,twilio,Javascript,Mongodb,Meteor,Twilio,我正在尝试在我的应用程序中存储短信对话。现在,我可以通过TwilioAPI成功发送短信。基本上,我有一个预先构建的消息集合,显示在一个表中,每个消息都可以通过单击“文本”按钮发送。这很有效 我在存储我的Twilio号码收到的SMS文本列表时遇到了问题(即,响应我从应用程序发送的文本)。我能从Twilio那里得到文本列表 下面是我的Meteor方法代码,它可以提取文本列表: Meteor.methods({ getTexts: function() { // Twilio Crede

我正在尝试在我的应用程序中存储短信对话。现在,我可以通过TwilioAPI成功发送短信。基本上,我有一个预先构建的消息集合,显示在一个表中,每个消息都可以通过单击“文本”按钮发送。这很有效

我在存储我的Twilio号码收到的SMS文本列表时遇到了问题(即,响应我从应用程序发送的文本)。我能从Twilio那里得到文本列表

下面是我的Meteor方法代码,它可以提取文本列表:

Meteor.methods({
  getTexts: function() {

    // Twilio Credentials
    var accountSid = 'someTwilioSid';
    var authToken = 'someAuthToken';
    var twilio = Twilio(accountSid, authToken);

    twilio.messages.list({}, function (err, data) {
      var texts = [];
      data.messages.forEach(function (message) {
        var text = {
          to: message.to,
          from: message.from,
          body: message.body
        };
        texts.push(text);
       //Texts.insert(text); // Uncommenting this causes a Meteor.bindEnvironment error
       console.log(text);
      });
    });
});
它返回例如此JSON:

I20150314-15:12:08.823(-5)? { to: '+11234567891',
I20150314-15:12:08.823(-5)?   from: '+11234567890',
I20150314-15:12:08.823(-5)?   body: 'Hello, welcome to Twilio from the command line!' }
I20150314-15:12:08.823(-5)? { to: '+11234567891',
I20150314-15:12:08.823(-5)?   from: '+11234567890',
I20150314-15:12:08.823(-5)?   body: 'Hello, welcome to Twilio!' }
看起来不错,除了我取消注释
文本。插入(文本)
,我得到:

>错误:Meteor代码必须始终在光纤中运行。尝试使用Meteor.bindEnvironment包装传递给非Meteor库的回调。

以下是我尝试过的
getTexts
的替代版本,当我取消注释
文本时,这两个版本都会导致
bindEnvironment
错误。插入(text)
行:

使用Meteor.wrapAsync

Meteor.wrapAsync(twilio.messages.list({}, function (err, data) {
  var texts = [];
  data.messages.forEach(function (message) {
    var text = {
      to: message.to,
      from: message.from,
      body: message.body
    };
    texts.push(text);
   //Texts.insert(text);
   console.log(text);
  });
}));
   Meteor.bindEnvironment(twilio.messages.list({}, function (err, data) {
      var texts = [];
      data.messages.forEach(function (message) {
        var text = {
          to: message.to,
          from: message.from,
          body: message.body
        };
        texts.push(text);
       //Texts.insert(text);
       console.log(text);
      });
    }));
使用Meteor.bindEnvironment

Meteor.wrapAsync(twilio.messages.list({}, function (err, data) {
  var texts = [];
  data.messages.forEach(function (message) {
    var text = {
      to: message.to,
      from: message.from,
      body: message.body
    };
    texts.push(text);
   //Texts.insert(text);
   console.log(text);
  });
}));
   Meteor.bindEnvironment(twilio.messages.list({}, function (err, data) {
      var texts = [];
      data.messages.forEach(function (message) {
        var text = {
          to: message.to,
          from: message.from,
          body: message.body
        };
        texts.push(text);
       //Texts.insert(text);
       console.log(text);
      });
    }));

我已经读过了,这肯定有助于为我指明正确的方向,但我仍然有困难。

好的,在仔细研究之后,我想出了下面的解决方案,效果非常好

Meteor.methods({
  getTexts: function() {
    // Twilio Credentials
    var accountSid = 'someTwilioSid';
    var authToken = 'someAuthToken';
    var twilio = Twilio(accountSid, authToken);

    var twilioMessagesListSync = Meteor.wrapAsync(twilio.messages.list, twilio.messages);

    var result = twilioMessagesListSync(
      function (err, data) {
        var texts = [];
        data.messages.forEach(function (message) {
          var text = {
            to: message.to,
            from: message.from,
            body: message.body,
            dateSent: message.date_sent,
            status: message.status,
            direction: message.direction
          };
          texts.push(text);
          Texts.insert(text);
        })
      }
    );
  }
});

希望这能帮助其他人。感谢您的优秀技术,它可以非常轻松地(最终)移植到Twilio应用程序。

这是我的解决方案。它与benvenker的非常相似,但包含额外的代码行,以防止重复数据填充我的本地mongo数据库

SMS = new Mongo.Collection('sms');

// Configure the Twilio client
var twilioClient = new Twilio({
  from: Meteor.settings.TWILIO.FROM,
  sid: Meteor.settings.TWILIO.SID,
  token: Meteor.settings.TWILIO.TOKEN
});
var getTwilioMessages = Meteor.wrapAsync(twilioClient.client.messages.list, twilioClient.client.messages);

function updateMessages() {
  getTwilioMessages(function(err, data) {
    if (err) {
      console.warn("There was an error getting data from twilio", err);
      return
    }
    data.messages.forEach(function(message) {
      if (SMS.find({
        sid: message.sid
      }).count() > 0) {
        return;
      }
      SMS.insert(message);
    });
  });
}

updateMessages();
Meteor.setInterval(updateMessages, 60000);
如果没有下面这篇非常有用的博文,我就无法理解这一点: