2012-11-16 28 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