List 没有请求密钥时CouchDB列表视图错误

List 没有请求密钥时CouchDB列表视图错误,list,view,couchdb,couchapp,List,View,Couchdb,Couchapp,我使用CouchApp编写的列表函数有问题,它从一个视图中获取名称,然后是id和值的散列列表,以便为用户创建一个CSV文件 function(head, req) { // set headers start({ "headers": { "Content-Type": "text/csv" }}); // set arrays var snps = {}; var test = {}; var inds = []; // get

我使用CouchApp编写的列表函数有问题,它从一个视图中获取名称,然后是id和值的散列列表,以便为用户创建一个CSV文件

function(head, req) {
    // set headers
    start({ "headers": { "Content-Type": "text/csv" }}); 

    // set arrays
    var snps = {}; 
    var test = {};
    var inds = [];

    // get data to associative array
    while(row = getRow()) {
        for (var i in row.value) {
            // add individual to list
            if (!test[i]) {
                test[i] = 1;
                inds.push(i);
            }   

            // add to snps hash
            if (snps[row.key]) {
                if (snps[row.key][i]) {
                    // multiple call
                } else {
                    snps[row.key][i] = row.value[i];
                }
            } else {
                snps[row.key] = {};
                snps[row.key][i] = row.value[i];
            }
            //send(row.key+" => "+i+" => "+snps[row.key][i]+'\n');
        }
    }

    // if there are individuals to write
    if (inds.length > 0) {
        // sort keys in array
        inds.sort();

        // print header if first
        var header = "variant,"+inds.join(",")+"\n";
        send(header);

        // for each SNP requested
        for (var j in snps) {
            // build row
            var row = j;
            for (var k in inds) {
                // if snp[rs_num][individual] is set, add to row string
                // else add ?
                if (snps[j][inds[k]]) {
                    row = row+","+snps[j][inds[k]];
                } else {
                    row = row+",?";
                }
            }

            // send row
            send(row+'\n');
        }
    } else {
        send('No results found.');
    }
}
如果我使用?key=“something”或?keys=[“something”,“other]请求_list/mylist/myview(其中mylist是上面的list函数,视图返回如上所述),那么它可以工作,但是删除查询字符串,我会得到以下错误:

{"code":500,"error":"render_error","reason":"function raised error: (new SyntaxError(\"JSON.parse\", \"/usr/local/share/couchdb/server/main.js\", 865)) \nstacktrace: getRow()@/usr/local/share/couchdb/server/main.js:865\n([object Object],[object Object])@:14\nrunList(function (head, req) {var snps = {};var test = {};var inds = [];while ((row = getRow())) {for (var i in row.value) {if (!test[i]) {test[i] = 1;inds.push(i);}if (snps[row.key]) {if (snps[row.key][i]) {} else {snps[row.key][i] = row.value[i];}} else {snps[row.key] = {};snps[row.key][i] = row.value[i];}}}if (inds.length > 0) {inds.sort();var header = \"variant,\" + inds.join(\",\") + \"\\n\";send(header);for (var j in snps) {var row = j;for (var k in inds) {if (snps[j][inds[k]]) {row = row + \",\" + snps[j][inds[k]];} else {row = row + \",?\";}}send(row + \"\\n\");}} else {send(\"No results found.\");}},[object Object],[object Array])@/usr/local/share/couchdb/server/main.js:979\n(function (head, req) {var snps = {};var test = {};var inds = [];while ((row = getRow())) {for (var i in row.value) {if (!test[i]) {test[i] = 1;inds.push(i);}if (snps[row.key]) {if (snps[row.key][i]) {} else {snps[row.key][i] = row.value[i];}} else {snps[row.key] = {};snps[row.key][i] = row.value[i];}}}if (inds.length > 0) {inds.sort();var header = \"variant,\" + inds.join(\",\") + \"\\n\";send(header);for (var j in snps) {var row = j;for (var k in inds) {if (snps[j][inds[k]]) {row = row + \",\" + snps[j][inds[k]];} else {row = row + \",?\";}}send(row + \"\\n\");}} else {send(\"No results found.\");}},[object Object],[object Array])@/usr/local/share/couchdb/server/main.js:1024\n(\"_design/kbio\",[object Array],[object Array])@/usr/local/share/couchdb/server/main.js:1492\n()@/usr/local/share/couchdb/server/main.js:1535\n@/usr/local/share/couchdb/server/main.js:1546\n"}

由于您没有给出详细信息,所以无法确定问题的一个可能来源是使用数组从每一行收集数据:它会消耗不可预测的内存量。这可能解释了为什么在查询少数记录时它会工作,而在查询所有记录时它会失败


您应该尝试以一种不需要在将输出发送到客户端之前收集所有值的方式来安排数据。请记住,虽然map和reduce结果保存在磁盘上,但列表函数会在每个查询上执行。如果您不快速精简列表函数,您将遇到问题。

注意:我从来没有真正做到过JavaScript之前,所以在试图确保我没有做得不正确时,代码并没有尽可能干净!