使用Response API从Typeform检索所有响应

时间:2018-12-12 18:15:06

标签: typeform

我正尝试使用“之前”和“之后”查询字符串参数从Typeform检索调查的所有响应,如此处所述:https://developer.typeform.com/responses/walkthroughs/#use-query-parameters-to-retrieve-specific-data

我宁愿不使用“ since”和“ until”,因为一天中可能会有1000多个响应(并且文档表明在这种情况下应使用before / after。)基于令牌的方法似乎无论如何都要清洁。

我的问题是,我永远无法检索与第一次调用中返回的“ total_items”值一致的结果集。也许我的期望不正确?我得出的值比这个值短数百。下面的代码摘录。我在第一个调用中包含一个空的“ before”查询字符串参数,因为文档表明该参数的存在会更改顺序以使其与流程顺序一致(而不是提交顺序)。

async getAllResults(formId) {
    const opts = {
      ...this._opts,
      url: `https://api.typeform.com/forms/${formId}/responses?page_size=1000&before`
    }

    let results = (await axios.request(opts)).data
    let allResults = results.items

    const totalResponseCount = results.total_items

    while (results.items.length > 0) {
      const lastToken = _.last(results.items).token
      results = (await axios.request({ ...opts, url: opts.url + `=${lastToken}` })).data
      allResults = _.concat(allResults, results.items)
    }

    // Fails
    assert.ok(allResults.length === totalResponseCount)

    return allResults
}

1 个答案:

答案 0 :(得分:0)

我试图自己运行代码,并且看起来总会有额外的结果被添加到最后。将其复制到allResults数组中,并将长度加1。

while循环是否应该持续到allResults.length === totalResponseCount为止?

所以代码是:

while (allResults.length != totalResponseCount && results.items.length > 0) {
  const lastToken = _.last(results.items).token
  results = (await axios.request({ ...opts, url: opts.url + `=${lastToken}` })).data
  allResults = _.concat(allResults, results.items)
}

您怎么看?