博客Javascript在帖子上出现JSON错误>;500

博客Javascript在帖子上出现JSON错误>;500,javascript,json,blogger,Javascript,Json,Blogger,我想向我的博主显示随机帖子 我从谷歌上获得了一个javascript并尝试了它,但随机发布的数量不正确(应该是10,但有时是4,有时是2,等等)。我试图检查发生了什么,发现json.feed.entry[500]抛出了错误 下面是我使用的javascript <script type="text/javascript"> function randomposts(json) { var randarray = new Array(); var l=0; var flag

我想向我的博主显示随机帖子

我从谷歌上获得了一个javascript并尝试了它,但随机发布的数量不正确(应该是10,但有时是4,有时是2,等等)。我试图检查发生了什么,发现json.feed.entry[500]抛出了错误

下面是我使用的javascript

<script type="text/javascript">

function randomposts(json) {
  var randarray = new Array();
  var l=0;
  var flag;
  var numofpost=10;

  var total = parseInt(json.feed.openSearch$totalResults.$t,10);

  for(var i=0;i < numofpost;) {
    flag=0;
    randarray.length=numofpost;
    l=Math.floor(Math.random()*total);
    for(j in randarray){
      if(l==randarray[j]){
        flag=1;}
    }
    if(flag==0&&l!=0){
      randarray[i++]=l;
    }
  }
  // correct output
  // alert(randarray);

  document.write('<ul>');

  // dummy for testing 500 limit 
  //for (var x = 0; x < numofpost; x++) {
  //  randarray[x]= 495 + x;
  //}

  for(var n in randarray){
    var p=randarray[n];
    var entry=json.feed.entry[p-1];
    var posttitle = entry.title.$t;
    for(var k=0; k < entry.link.length; k++){
      if(entry.link[k].rel=='alternate'){
        document.write('<li> ' + posttitle.link(entry.link[k].href) + '</li>');

      }
    }
  }
  document.write('</ul>');
}
</script>
<script src="/feeds/posts/default?alt=json-in-script&start-index=1&max-results=1000&callback=randomposts" type="text/javascript"></script>

函数(json){
var randarray=新数组();
var l=0;
var标志;
var numofpost=10;
var total=parseInt(json.feed.openSearch$totalResults.$t,10);
对于(变量i=0;i”);
//500极限试验用假人
//对于(var x=0;x'+postitle.link(entry.link[k].href)+'');
}
}
}
文件。写(“”);
}
目前我设置的
var总计=500
这样随机设置只对前500篇文章有效

如何解决这个问题

更新: 我添加了try-catch块,错误是TypeError:无法读取未定义的属性“title”

更新2: 下图是控制台的快照。json.feed.entry 500未定义。

当您将
最大结果设置为1000时,从服务器返回的条目将限制为500。但是,如果访问
json.feed.openSearch$totalResults.$t
,它仍然会返回正确的条目总数


因此,随机索引处的提要条目似乎为空,在这种情况下,添加另一个条件以确保随机索引中的每个条目都不为空

替换:

if(flag==0&&l!=0){
与:

我希望这能解决你的问题

问候,

聚丙烯

编辑: 然后,您可以两次调用提要url,这是实现此目的的快速而肮脏的方法:

<script type="text/javascript">
var a=0;
var b=0;
var entries = new Array();
function randomposts(json) {
  for (var i in json.feed.entry) {
    var entry = json.feed.entry[i];
    if (entry != null) {
        entries[b++] = entry;
    }
  }
  a++;
  if (a < 2) return;
  var randarray = new Array();
  var l=0;
  var flag;
  var numofpost=10;

  var total = entries.length;

  for(var i=0;i < numofpost;) {
    flag=0;
    randarray.length=numofpost;
    l=Math.floor(Math.random()*total);
    for(j in randarray){
      if(l==randarray[j]){
        flag=1;}
    }
    if(flag==0&&l!=0){
      randarray[i++]=l;
      //alert(l);
    }
  }
  // correct output
  // alert(randarray);

  document.write('<ul>');

  // dummy for testing 500 limit 
  //for (var x = 0; x < numofpost; x++) {
  //  randarray[x]= 495 + x;
  //}

  for(var n in randarray){
    var p=randarray[n];
    var entry=entries[p-1];
    var posttitle = entry.title.$t;
    for(var k=0; k < entry.link.length; k++){
      if(entry.link[k].rel=='alternate'){
        document.write('<li> ' + posttitle.link(entry.link[k].href) + '</li>');

      }
    }
  }
  document.write('</ul>');
}
</script>

<script src="/feeds/posts/default?alt=json-in-script&start-index=1&max-results=500&callback=randomposts" type="text/javascript"></script>
<script src="/feeds/posts/default?alt=json-in-script&start-index=501&max-results=500&callback=randomposts" type="text/javascript"></script>

var a=0;
var b=0;
var entries=新数组();
函数(json){
for(json.feed.entry中的变量i){
var entry=json.feed.entry[i];
if(条目!=null){
条目[b++]=条目;
}
}
a++;
如果(a<2)返回;
var randarray=新数组();
var l=0;
var标志;
var numofpost=10;
var total=条目的长度;
对于(变量i=0;i”);
//500极限试验用假人
//对于(var x=0;x'+postitle.link(entry.link[k].href)+'');
}
}
}
文件。写(“”);
}

Blogger将每个请求的最大条目数限制为500条,尽管没有记录在案,但显然如此。如果要获取所有条目,必须逐块重新构建提要块设置
开始索引
属性:
/feeds/posts/default?开始索引=501
。 在这里,您可以找到更多信息:

我建议使用来检索博客的帖子

请参见以下示例:

  <script>
  function renderResults(response) {
    if (response.items) {
      for (var i = 0; i < response.items.length; i++) {
        //do whatever you want with the posts of your blog
      }      
    }
    if(response.nextPageToken) {
      var blogId = 'XXX Your blogId XXX';
      var request = gapi.client.blogger.posts.list({
        'blogId': blogId,
        'pageToken': response.nextPageToken,
        'maxResults': 100,
      });
      request.execute(renderResults);
    }
  }
  function init() {
    gapi.client.setApiKey('XXX Get your API Key from https://code.google.com/apis/console XXX');
    gapi.client.load('blogger', 'v3', function() {
        var blogId = 'XXX Your blogId XXX';
        var request = gapi.client.blogger.posts.list({
          'blogId': blogId,
          'maxResults': 100,
        });
        request.execute(renderResults);        
    });
  }
  </script>
  <script src="https://apis.google.com/js/client.js?onload=init"></script>

函数渲染结果(响应){
if(响应项目){
对于(var i=0;i
你的错误是什么?@KemalFadillah:在最后一节中添加了check“entry”。.wht r u在“var entry=json.feed.entry[p-1];”行中到达那里?@Rinku错误清楚地表明它是
未定义的
@KemalFadillah:我有800多篇帖子,生成的随机数是正确的(低于最大值)。谢谢。虽然这可能是问题的根源,但它并不能解决我的问题。在放弃之前,我会先尝试解决并等待其他答案:你可以尝试让你的函数生成一个介于0和499之间的随机数(如果是基于1的,则为1-500)。但话说回来,这基本上就是你现在正在做的工作。老实说,我看没有别的办法。但也许这只是我的迟钝。你的更新只是权宜之计,如果我把帖子总数设为500篇的话,会得到类似的结果。使用两个feed似乎有效。你能解释一下它是怎么工作的吗?还有性能下降吗?正如凯末尔·法迪拉(Kemal Fadillah)提供的答案,谷歌将返回的feed数量限制在500个,但您可以通过start index param更改想要获取的feed的范围。因此,脚本所做的是请求两组500
  <script>
  function renderResults(response) {
    if (response.items) {
      for (var i = 0; i < response.items.length; i++) {
        //do whatever you want with the posts of your blog
      }      
    }
    if(response.nextPageToken) {
      var blogId = 'XXX Your blogId XXX';
      var request = gapi.client.blogger.posts.list({
        'blogId': blogId,
        'pageToken': response.nextPageToken,
        'maxResults': 100,
      });
      request.execute(renderResults);
    }
  }
  function init() {
    gapi.client.setApiKey('XXX Get your API Key from https://code.google.com/apis/console XXX');
    gapi.client.load('blogger', 'v3', function() {
        var blogId = 'XXX Your blogId XXX';
        var request = gapi.client.blogger.posts.list({
          'blogId': blogId,
          'maxResults': 100,
        });
        request.execute(renderResults);        
    });
  }
  </script>
  <script src="https://apis.google.com/js/client.js?onload=init"></script>