Meteor:从 Twilio 获取 SMS 文本列表并将它们插入 mongoDB
Meteor: Get a list of SMS texts from Twilio and insert them into mongoDB
我正在尝试在我的应用程序中存储 SMS 文本消息对话。现在,我可以通过 Twilio API 成功发送短信。基本上,我有一组预先构建的消息,显示在 table 中,每条消息都可以通过单击 "Text it" 按钮发送。这很好用。
我 运行 在存储我的 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);
});
});
});
哪个 returns 例如,这个 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)
,我得到:
> Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.
这是我尝试过的 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 for the excellent answer 很容易(最终)移植到 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);
如果没有以下非常有用的博客,我无法理解这一点 post:
http://blog.jakegaylor.com/2015/11/26/hello-twilio-meteor-here/
我正在尝试在我的应用程序中存储 SMS 文本消息对话。现在,我可以通过 Twilio API 成功发送短信。基本上,我有一组预先构建的消息,显示在 table 中,每条消息都可以通过单击 "Text it" 按钮发送。这很好用。
我 运行 在存储我的 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);
});
});
});
哪个 returns 例如,这个 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)
,我得到:
> Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.
这是我尝试过的 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 for the excellent answer 很容易(最终)移植到 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);
如果没有以下非常有用的博客,我无法理解这一点 post:
http://blog.jakegaylor.com/2015/11/26/hello-twilio-meteor-here/