express.js中的数组foreach错误

时间:2017-09-08 20:32:35

标签: javascript arrays express

我想为我的网站生成动态搜索。在解析查询字符串后,我使用req.query来获取JS对象。我在foreach中以变量名价格面临问题。 网址是: http://www.localhost:3000/listing?price=1&price=2&gender=men&gender=women

var arrayGet = req.query;
var query ={};

for (var k in arrayGet){
    if (arrayGet.hasOwnProperty(k)) {
        if(k =='gender'){
            var gender = arrayGet[k];
            query["gender"] = { "$in" : gender };

        }else if(k =='colour'){
            var colour = arrayGet[k];
            query["colour"] = { "$in" : colour };

        }else if(k =='price'){
            price = arrayGet[k];

            if(price.constructor !== Array){
                var price = JSON.parse("[" + price + "]");
            }
            console.log(price);
            query.$or = price.forEach(function (currentarray, i) {
                console.log('value: '+currentarray[i]);
                if(price[i] =='1'){
                    return {
                        'price': {'$gte': 0 , '$lte': 100}
                    }
                }else if(price[i] =='2'){
                    return {
                        'price': {'$gte': 100 , '$lte': 150}
                    }
                }else if(price[i] =='3'){
                    return {
                        'price': {'$gte': 150 , '$lte': 200}
                    }
                }else if(price[i] =='4'){
                    return {
                        'price': {'$gte': 200 , '$lte': 1000}
                    }
                }
            });

        }else if(k =='material'){
            var material = arrayGet[k];
            query["attributes.caseMaterial"] = { "$in" : material };
        }else if(k =='size'){
            var size = arrayGet[k];
            query["item"] = {$elemMatch: { 'size': { $regex: size, $options: "-i"}, 'stock' : "Available"}};
        }else if(k =='options'){
            var options = arrayGet[k];
            query["attributes.options"] = { "$in" : options };
        }
    }
}


console.log(query);

Product.find(query, function (err, results) {
    console.log(results);
});

错误消息是:

[' 1',' 2' ]

值:1

值:未定义

{' $或&#39 ;: undefined,gender:{' $ in':[' men',' women' ]}}

未定义

1 个答案:

答案 0 :(得分:2)

为什么会得到{ '$or': undefined, ... }

你这样做:

query.$or = price.forEach(...)

但是these docs say, forEach returns undefined。所以,这是正常的。您应该使用map代替。它将返回一个包含两个元素的新数组:

query.$or = price.map(...)

为什么会得到value: undefined

您使用的是currentarray参数,但这不是您获得的数组,而是当前价格。因此,在您的示例中,currentarray[1]等于'2'[1],即undefined

可能的解决方案

如果这样编写,你的代码会更简单:

query.$or = price.map(function (currentPrice) {
    switch(currentPrice) {
        case '1': return {'price': {'$gte': 0 ,   '$lte': 100} };
        case '2': return {'price': {'$gte': 100 , '$lte': 150} };
        case '3': return {'price': {'$gte': 150 , '$lte': 200} };
        case '4': return {'price': {'$gte': 200 , '$lte': 1000}};
        default : return {};
    }
});