Node.js Twilio Node JS-过滤每个电话号码的短信

Node.js Twilio Node JS-过滤每个电话号码的短信,node.js,rest,twilio,Node.js,Rest,Twilio,我想使用REST API过滤每个电话号码和发送日期的短信,但是以下代码的输出在client.messages.each()块之外不可用。 请告知我如何使用发送到过滤号码的最新短信代码: const filterOpts = { to: '+13075550185', dateSent: moment().utc().format('YYYY-MM-DD') }; let pattern = /([0-9]{1,})$/; let codeCollection = []; client.m

我想使用REST API过滤每个电话号码和发送日期的短信,但是以下代码的输出在client.messages.each()块之外不可用。 请告知我如何使用发送到过滤号码的最新短信代码:

const filterOpts = {
  to: '+13075550185',
  dateSent: moment().utc().format('YYYY-MM-DD')
};
let pattern = /([0-9]{1,})$/;
let codeCollection = [];
client.messages.each(filterOpts, (record) => {
  codeCollection.push(record.body.match(pattern)[0]);
  console.log(record.body.match(pattern)[0], record.dateSent);
 });
 console.log(codeCollection,'I get an empty array here');//how to get 
 the latest sms and use it 
 doSomethingWithSMS(codeCollection[0]);

您有权访问消息数组的长度吗?如果是这样,你可以这样做

const filterOpts = {
  to: '+13075550185',
  dateSent: moment().utc().format('YYYY-MM-DD')
};
let pattern = /([0-9]{1,})$/;
let codeCollection = [];
var i = 0
client.messages.each(filterOpts, (record) => {
    if (i < messages.length){
        codeCollection.push(record.body.match(pattern)[0]);
        console.log(record.body.match(pattern)[0], record.dateSent);
        i++;
    else {
        nextFunction(codeCollection);
    }
 });

function nextFunction(codeCollection){
     console.log(codeCollection,'I get an empty array here');
     doSomethingWithSMS(codeCollection[0]);
}
const filterOpts={
致:“+13075550185”,
dateSent:moment().utc().format('YYYY-MM-DD')
};
let pattern=/([0-9]{1,})$/;
让codeCollection=[];
变量i=0
client.messages.each(filterOpts,(record)=>{
if(i
消息。each()
是异步运行的,因此当
客户端.messages()
东西在后台线程上运行时,您的主线程将转到下一个调用。因此,在您尝试访问它时,没有任何内容被推送到codeCollection。您需要以某种方式等待each()在继续之前完成。Twilio客户端使用主干样式的承诺,因此您可以向链添加另一个.then()链接,如下所示。您还可以使用类似async的库,它允许您使用Wait以更线性的方式编写异步代码

const filterOpts = {
  to: '+13075550185',
  dateSent: moment().utc().format('YYYY-MM-DD')
};
let pattern = /([0-9]{1,})$/;
let codeCollection = [];
client.messages.each(filterOpts, (record) => {
    codeCollection.push(record.body.match(pattern)[0]);
    console.log(record.body.match(pattern)[0], record.dateSent);
}).then(
    function() {
        console.log(codeCollection,'I get an empty array here');
        if( codeCollection.count > 0 ) doSomethingWithSMS(codeCollection[0]);
    }
);

这里是Twilio开发者福音传道者

实际上,不会返回一个
Promise
。您可以在每个
流式处理结果完成后运行回调函数,方法是将其作为
done
传递到选项中,如下所示:

const codeCollection = [];
const pattern = /([0-9]{1,})$/;

const filterOpts = {
  to: '+13075550185',
  dateSent: moment().utc().format('YYYY-MM-DD'),
  done: (err) => {
    if (err) { console.error(err); return; }
    console.log(codeCollection);
    doSomethingWithSMS(codeCollection[0]);
  }
};

client.messages.each(filterOpts, (record) => {
  codeCollection.push(record.body.match(pattern)[0]);
  console.log(record.body.match(pattern)[0], record.dateSent);
 });

让我知道这是否有帮助。

你得到一个空数组的
控制台.log
很可能在你的
记录被推入回调函数的内部之前被执行。试着在
内登录。每个
在被推入
codeCollection
是之后。但是我需要调用另一个函数,只需使用最新的sms代码即可。each()中的console.log将返回今天发送的电话号码的所有代码。如果没有,则必须执行单独的异步调用才能获取消息数。我无法访问client.messages.each()之外的数组我可以在该块内部预览输出,但不能在该块外部预览输出。也不能使用。then to chain promiss,因为它看起来是client.messages.each不会返回promissA问题。库是否需要提供对异步/承诺的支持才能使用。然后()例如?@db2791根据我的经验,我使用过的所有具有异步功能的库都与主干风格的承诺兼容,即..then()起作用。这并不是说这是一个普遍的事实,但我从来没有在我的任何项目中显式地包括主干,并且一直使用。then()当使用asynchronasity时。async是一个独立的库,它使使用异步函数变得更简洁。我相信它实际上内置在node的更高版本中。可能是node默认包含主干样式承诺?我所有的javascript应用程序都使用node。因此,很抱歉,我无法明确回答您的问题,but我希望这会有帮助。Twilio似乎是同步运行代码的,因此如果我想链接promise,就无法读取未定义的属性'then'。基本上是console.log()每个块的内部显示输出,因此代码必须是同步的。每个块内部的console.log的输出是例如:3164 2018-03-02T13:56:39.000Z 0778 2018-03-02T13:54:49.000Z 1883 2018-03-02T13:51:22.000Z 7753 2018-03-02T13:50:04.000Z但是,如何获得每个块外部的记录?提供的解决方案不起作用