1

我试图循环一个 json 文件并挑选出每一集,但我很困惑我的循环只输出第一个current_episode,如果有人能检查我的问题,非常感谢!

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

5 回答 5

7

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();
    })
}); 
于 2012-11-16T14:23:16.900 回答
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") );
    })
});
于 2012-11-16T14:24:11.343 回答
1

因为你在循环中有 res.send(myChannel) 。res.send 正在发送找到的第一个通道,并忽略对 res.send() 的下一次调用。

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

于 2012-11-16T14:30:01.457 回答
0

我发现最简单的方法是:

您可以尝试以下操作,但它也会将所有键加载到内存中

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

然而,由于 Object.keys 是一种本机方法,它可能允许更好的优化。

虽然这是我一直都会做的代码,但我在这里找到了这个(稍微透明的代码),同时检查这是否是做事的最佳方式:迭代 node.js 中的对象键

于 2015-06-23T22:39:19.573 回答
-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)       
    }
} 
}
于 2014-04-29T07:27:35.960 回答