如何在Node.js中使用twilio fetch会议功能创建自定义对象/数组

时间:2018-11-12 07:17:44

标签: javascript node.js async-await twilio

我一直在尝试生成自定义对象数组或JSON对象,以获取Twilio获取会议API提供的会议对象的特定字段。但是由于Node.js是异步的,因此无法实现该目标,并且由于在每个函数中被回调,因此返回的状态不确定。尝试了各种方法,但由于注册了node.js的操作性质而无法获得结果,并且执行了下一条语句。还尝试了promise和async-await的各种选择。但是,无法获得可能是在每个循环中回调的结果(我的猜测)。

由于Node.Js是新手,因此需要一些建议来实现。一种选择是使用settimeout,但这又不是一个真正的解决方案,因为在生产中的系统无法获取所需时间的信息的情况下。代码如下:

exports.fetchLiveConferences = function(req, res, next) {
    let conferencesArray = [];

    client.conferences.each({
        dateCreated: new Date(),
        status: 'In-progress'
    }, conferences => {
        /* call back function at this point conferences object is available and can extract properties so pushing it to my array.
         */
        conferencesArray.push({
            conferenceSid: conferences.sid,
            conferenceName: conferences.friendlyName,
            conferenceStatus: conferences.status,
        });
    })

    console.log(conferencesArray);
    /* due to async nature the below statement is executed once call back is registered by node.js in event loop and undefined is returned. 
     */
    res.send(conferencesArray);
}

3 个答案:

答案 0 :(得分:2)

这里是Twilio开发人员的传播者。

您的问题是,您正在使用each独立列出会议。如果您只想使用列表,则应使用list方法,然后在回调中返回结果。

尝试这样的事情。

exports.fetchLiveConferences = function(req, res, next) {
  client.conferences.list({
      dateCreated: new Date(),
      status: 'In-progress'
  }, (err, conferences) => {
    if (err) { console.error(err); return; }
    conferencesArray = conferences.map(conference => ({
        conferenceSid: conference.sid,
        conferenceName: conference.friendlyName,
        conferenceStatus: conference.status,
    }));
    res.send(conferencesArray);
  })
}

在这种情况下,回调中的conferences注入是会议列表。然后,您可以map在会议上构建所需的对象,并将它们作为响应返回。

更新

如果要使用Promise和asyncawait,则list方法也会返回一个Promise。您可以像这样使用它。

const fetchConferenceList = () => {
  return client.conferences.list({
    dateCreated: new Date(),
    status: 'In-progress'
  }).then(conferences => conferences.map(conference => ({
    conferenceSid: conference.sid,
    conferenceName: conference.friendlyName,
    conferenceStatus: conference.status,
  })));
}

exports.fetchLiveConferences = async function(req, res, next) {
  const conferenceData = await fetchConferenceList();
  res.send(conferenceData);
}

答案 1 :(得分:1)

您应该只能将res.send函数放在回调中,如下所示:

client.conferences.each({
    dateCreated: new Date(),
    status: 'In-progress'
}, conferences => {
    /* call back function at this point conferences object is available and can extract properties so pushing it to my array.
     */
    conferencesArray = conferences.map(c => {
        return {
            conferenceSid: c.sid,
            conferenceName: c.friendlyName,
            conferenceStatus: c.status,
        }
    });
    res.send(conferencesArray);
})

答案 2 :(得分:1)

感谢大家的回应,特别是Phil提到了具有地图功能的列表方法。但是,使用twilio .each()方法,我可以使用以下代码生成自定义对象。

exports.fetchLiveConferences = async function fetchLiveConferences(req, res, next){
const conferenceData = await fetchConferenceList();
res.send(conferenceData);
}

fetchConferenceList = function () {
let conferenceArray = [];
return new Promise((resolve, reject) => {
    client.conferences.each({
            dateCreated: new Date(),
            status: 'in-progress'
        },
        conferences => {
            conferenceArray.push({
                conferenceSid: conferences.sid,
                conferenceName: conferences.friendlyName,
                conferenceStatus: conferences.status
            });
            resolve(conferenceArray);
        })
})
}