javascript - Meteor:从 Twilio 获取 SMS 文本列表并将其插入 mongoDB

标签 javascript mongodb meteor twilio

我正在尝试在我的应用程序中存储短信对话。现在,我可以通过 Twilio API 成功发送短信。基本上,我有一组预先构建的消息,这些消息显示在表格中,并且每条消息都可以通过单击“发短信”按钮来发送。这效果很好。

我在存储我的 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!' }

看起来不错,除了我取消注释 Texts.insert(text) 后,我得到:

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

以下是我尝试过的 getTexts 的替代版本,当我取消注释 Texts.insert(text) 时,这两个版本都会出现 bindEnvironment 错误 行:

使用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.bindEnvironemnt

   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: Proper use of Meteor.wrapAsync on server ,这绝对有助于为我指明正确的方向,但我仍然遇到麻烦。

最佳答案

好的,仔细查看 Meteor: Proper use of Meteor.wrapAsync on server 后,我想出了下面的解决方案,效果非常好。

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

希望这可以帮助其他人。感谢saimeunt为优秀answer很容易(最终)移植到 Twilio 应用程序。

关于javascript - Meteor:从 Twilio 获取 SMS 文本列表并将其插入 mongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29054679/

相关文章:

multithreading - MongoCursor 在单独的线程中倒回

javascript - Meteor WhatsApp 克隆教程不会在 chats.controller.js 中构造 ChatsCtrl

javascript - Meteor - 在发布中创建变量

javascript - 将 XXX.db.bson_serializer.ObjectID.createFromHexString(id) 外包给函数?

javascript - 在具有许多连接的数据库中快速分配游戏管理

javascript - 带有特殊符号自动完成功能的自由文本输入

Javascript、Jquery 和 jade : Dynamic forms not showing up in all the instances of relevant elements

javascript - 如果非法传递了错误的参数,函数会返回什么,这样有利于调试。

javascript - 使用 jquery 动态设置位置

javascript - 转换 RxJS Observable