2012-11-16 27 views
1

我试图通过json文件循环并挑选出每一集,但我很困惑,我的循环只输出第一个current_episode,非常感谢如果任何人都可以检查我的问题!在express.js中循环json数据

app.get('/episodes', function(req, res){ 
    fs.readFile('channels.json', 'utf8', function (err, data) { 
     var jsondata = JSON.parse(data); 
     for (var i=0; i<jsondata.channels.length; i++){ 
      var myChannel = jsondata.channels[i].current_episode; 
      res.send(myChannel); 
     } 
    }) 
}); 

我的JSON数据:

{ 
    "total": 70, 
    "request_uri": "\/channels\/", 
    "channels": [ 
    { 
     "channel_id": 42, 
     "current_episode": [ 
     { 
      "id": 126248, 
      "title": "Spanarna", 
     } 
     ] 
    }, 
    { 
     "channel_id": 43, 
     "current_episode": [ 
     { 
      "id": 126255, 
      "title": "Beck: I stormens \u00f6ga", 
     } 
     ] 
    }, 
............ 
} 

回答

4

res.send写入数据并结束该请求。试试这个:

app.get('/episodes', function(req, res){ 
    fs.readFile('channels.json', 'utf8', function (err, data) { 
     var jsondata = JSON.parse(data); 
     res.writeHead(200, {'Content-Type': 'text/plain'}); 
     for (var i=0; i<jsondata.channels.length; i++){ 
      var myChannel = jsondata.channels[i].current_episode; 
      res.write(JSON.stringify(myChannel)); 
     } 
     res.end(); 
    }) 
}); 
+0

遇到错误'类型错误:第一个参数必须是一个字符串或Buffer# – nihulus

+0

@nihulus如果'myChannel'不是一个字符串,你需要将它转换为一个。最简单的就是'JSON.stringify(myChannel)' – JohnnyHK

+0

是的,我刚刚完成了,感谢您的帮助 – nihulus

2

尝试建立你的剧集的字符串。

app.get('/episodes', function(req, res){ 
    fs.readFile('channels.json', 'utf8', function (err, data) { 
     var jsondata = JSON.parse(data), 
      myChannel = []; 
     for (var i=0; i<jsondata.channels.length; i++){ 
      myChannel.push(jsondata.channels[i].current_episode); 
     } 
     res.send(myChannel.join("\n")); 
    }) 
}); 
+0

我得到了一个输出所有数据是对象[对象对象] – nihulus

+0

糟糕,是的,你需要做另一个循环来循环current_episode,因为它也是一个基于你的结构的数组。 – jcreamer898

1

因为你已经res.send(myChannel)循环。 res.send发现第一个通道,并忽略对res.send()的下一次调用。

取而代之的是,您应该将所有通道连接成一个字符串,然后发出一个res.send(allChannels)以外的循环。

我发现
-1
function search_items(args) { 
if (args) {  
    string = args.toLowerCase().replace(/"/g, "").replace(/'/g, "").split(" "); 
    for (var i=0, j=0; i<string.length; i++) {   
    (function(i){   

     vocabulary.findOne({word:string[i]}, function(error, search){ // find vocabulary info 

     if (!error && search) { 
j++; 
     pages.findOne({voc_id:ObjectID(search._id)}, function(error, pages){ // find pages info 

      if (!error && pages) { 

      page_tokens.findOne({page_id:ObjectID(pages._id), voc_id:ObjectID(search._id)}, function(error, page_token){ // find page tokens info 

       if (!error && page_token) { 

       pos_tags.findOne({_id:ObjectID(page_token.pos_tag_id)}, function(error, pos_tag){ // find pos_tags info 

        if (!error && pos_tag) { 

        resultTotal.push({vocabulary:search.word, pages:{doc:pages.base_url+pages.path}, page_tokens:{sentence_number:page_token.sentance_number,token_position: page_token.token_position}, pos_tags: { tag:pos_tag.tag } }); 
        j--; 
        console.log(j); 
        if (j==0) { 

         res.json({success:resultTotal}); 

        } 

        } else { 
        res.json({ error:true });      
        }   

       }); 

       } 

      });    
      }   
     });   
     }   
    });  
    })(i)  
    } 
} 
} 
0

最简单的方法是:

你可以尝试以下,但它也将所有的按键加载到内存

Object.keys(o).forEach(function(key, index, originalObject) { 
    var val = o[key]; 
    logic(); 
}); 

但是,由于Object.keys是一个本地方法是可能允许更好的优化。

虽然这是同时检查代码,我会一直做我发现这个在这里(略透明代码),如果这是应该做的事情最优化的方式:Iterate over object keys in node.js