Javascript 在express.js中循环处理json数据

Javascript 在express.js中循环处理json数据,javascript,json,node.js,express,Javascript,Json,Node.js,Express,我试图循环一个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.

我试图循环一个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);
        }
    })
}); 

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();
    })
}); 
app.get('/scents',函数(req,res){
fs.readFile('channels.json','utf8',函数(err,data){
var jsondata=JSON.parse(数据);
res.writeHead(200,{'Content-Type':'text/plain'});

for(var i=0;i
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();
    })
}); 
app.get('/scents',函数(req,res){
fs.readFile('channels.json','utf8',函数(err,data){
var jsondata=JSON.parse(数据);
res.writeHead(200,{'Content-Type':'text/plain'});

对于(var i=0;i试着构建一系列你的剧集

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") );
    })
});
app.get('/scents',函数(req,res){
fs.readFile('channels.json','utf8',函数(err,data){
var jsondata=JSON.parse(数据),
myChannel=[];

对于(var i=0;i试着构建一系列你的剧集

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") );
    })
});
app.get('/scents',函数(req,res){
fs.readFile('channels.json','utf8',函数(err,data){
var jsondata=JSON.parse(数据),
myChannel=[];
对于(var i=0;i,因为循环中有res.send(myChannel)res.send在查找时发送第一个通道,并忽略对res.send()的下一个调用

相反,您应该将所有通道连接成一个字符串,并在循环外部发出res.send(allChannels)

因为您在循环内部有res.send(myChannel)。res.send会在找到时发送第一个通道,并忽略对res.send()的下一个调用

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)       
    }
} 
}
相反,您应该将所有通道连接成一个字符串,并在循环外部发出res.send(allChannels)

函数搜索项目(args){
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)       
    }
} 
}
如果(args){ string=args.toLowerCase().replace(/“/g,”).replace(/“/g,”).split(“”); 对于(var i=0,j=0;i
函数搜索_项(args){
如果(args){
string=args.toLowerCase().replace(/“/g,”).replace(/“/g,”).split(“”);

对于(var i=0,j=0;i我发现的最简单的方法是:

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

Object.keys(o).forEach(function(key, index, originalObject) {
  var val = o[key];
  logic();
});
然而,由于Object.keys是一种本机方法,因此它可能允许更好的优化


虽然这是我一直会做的代码,但在检查这是否是做事情的最佳方法时,我在这里发现了这一点(稍微透明一些的代码):

我发现的最简单的方法是:

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

Object.keys(o).forEach(function(key, index, originalObject) {
  var val = o[key];
  logic();
});
然而,由于Object.keys是一种本机方法,因此它可能允许更好的优化


虽然这是我一直会做的代码,但在检查这是否是做事情的最佳方式时,我在这里发现了这一点(稍微透明一些的代码):

我得到了一个输出,所有数据都是对象[object object]哦,是的,你需要在当前的_集上有另一个循环,因为它也是一个基于你的结构的数组。我得到了一个输出,所有数据都是object[object]Oops,是的,你需要在当前的节目中有另一个循环,因为它也是基于你的结构的数组。Get error
TypeError:第一个参数必须是字符串或缓冲区,如果
myChannel
不是一个字符串,你需要将它转换成一个。最简单的是
JSON.stringify(myChannel)
@nihulus如果
title
current\u插曲
的一个属性,你就应该这样做。@nihulus那么
current\u插曲
在这种情况下必须是
null
。将其记录到控制台以帮助调试。出现错误
类型错误:第一个参数必须是字符串或缓冲区
@nihulus如果
myChannel
不是您需要将其转换为一个字符串。最简单的是
JSON.stringify(myChannel)
@nihulus,如果
title
current\u插曲
的一个属性,那么就是这样做的。@nihulus那么
current\u插曲
在这种情况下必须是
null
。将它记录到控制台以帮助调试它。