Yelp API - Node.js中每秒请求太多

问题描述 投票:-1回答:2

专家介绍,

似乎yelp最近更改了他们的REST API以限制每秒可以发出的请求数量。我尝试过使用setTimeout和各种睡眠功能都没有成功。我相信它与setTimeout有关。我只收到一些回复和一大堆TOO_Many_Requests_Per_Second。此外,我正在使用Node.js Fusion API客户端。任何帮助,将不胜感激。提前致谢。

这是下面的代码,因为我从我的Parse Server获取了Yelp URL,我想得到Y​​elp Business Name响应:

'use strict';

var Parse = require('parse/node');

Parse.initialize("ServerName");
Parse.serverURL = 'ParseServerURL';
const yelp = require('yelp-fusion');
const client = yelp.client('Key');

var object;
var Business = Parse.Object.extend("Business");
var query = new Parse.Query(Business);

query.notEqualTo("YelpURL", "Bus");

query.find({
success: function(results) {

  for (var i = 0; i < results.length; i++) {
    object = results[i];
    //I belive a setTimeout block needs to come somewhere in here.  Tried many places but with no success.
    client.business(object.get('YelpURL')).then(response => {
     console.log(response.jsonBody.name);

    }).catch(e => {
     console.log(e);
    });
   }
  },

  error: function(error) {
   alert("Error" + error.code + " " + error.message);
  }

 });
node.js parse-platform yelp
2个回答
1
投票

使用查询each,它将迭代每个对象并按顺序执行请求,而不是一次或多或少地执行:

query.each(
    function(object) {
        return client.business(object.get('YelpURL')).then(response => {
            console.log(response.jsonBody.name);
        });
    }
).catch( e => {
    res.json('error');
});

关于这一点的一个很酷的事情是它会自动传播来自client.bussiness()调用的错误,如果有一个到底部的catch块。它将一次迭代一个对象,并且因为我们“返回”client.business()调用的结果,所以在你得到响应之前它不会移动到下一个对象。 query.each()还将迭代符合查询条件的集合中的每个对象,因此您不必担心限制。


0
投票

我不太确定这是否是你想要的,但你可以检索每个请求最多50条记录,在下面的例子中将返回该邮政编码中的20个商业名称,或者你可以稍微调整它以返回所有数据那些企业,这有帮助:

app.get('/:id', (req, res) => {
  let zipcode = req.params.id;
  let names = [];
  let searchRequest = {
    term: 'Business', // or for ex. food
    limit: 20, //set the number of responses you want up to 50
    radius: 20000, // 20 miles
    location: zipcode
  };
    client.search(searchRequest)
    .then(response => {
      response.jsonBody.businesses.map(elem => {
        names.push(elem.name);
      })
      res.json(names); // business names only
      //or
      //res.json(response.jsonBody.businesses) //all details included with business name    
    }).catch(e => {
      res.json('error');
    });
})
© www.soinside.com 2019 - 2024. All rights reserved.