麻烦在mongoose$ gt

我已经用下面的查询成功地查询了我想要在mongo CLI中的内容。

db.catches.find({'weightTotal': {'$gte' : 150} }) 

然而,当我试图发送一个查询从angular度到这样的路线(多一点特异性):

 Hatchery.getByLocation( { 'x': $scope.yx_id, 'city': place.data[0].city, 'weightTotal': {'$gte' : 150 } }) 

当mongoose的东西爆炸时,我得到了一个常见的错误:

 TypeError: Cannot call method 'toString' of undefined at ServerResponse.writeHead (http.js:1180:45) at ServerResponse.writeHead (/Users/ShiftedRec/x/y/node_modules/express-session/node_modules/on-headers/index.js:53:19) 

但更具体的(控制台logging错误)

 { message: 'Cast to number failed for value "{"$gte":150}" at path "weightTotal"', name: 'CastError', kind: 'number', value: '{"$gte":150}', path: 'weightTotal' } 

我已经通过在path中的某个位置得到了这个工作,但我宁愿将所有内容都放在查询中。 它可以保持我的路线更清洁,如果我只是通过我所需要的查询,而不是做基于权限等条件的条件。

查询传递的path如下所示:

 router.get('/', function (req, res, next) { User .find(req.query) .populate('post') .exec(function (err, data){ if (err) return next(err); res.json(data); }); }); 

req.query控制台login到这个:

 { x: '5581efdcc465c1ccd97a1f6b', y: '5581efe2458256f5d9848ca7', weightTotal: '{"$gt": 150}' } 

我正在使用Mongoose 4.0.1。 有任何想法吗?

GET请求查询是string,所以如果你发送这个:

 www.mysite.com/?data=1&weightTotal=5 

你会得到这个(string,而不是数字):

 {data: "1", weightTotal: "5"} 

为了使用这些数据,你可以以某种方式parsing它,例如:

 req.query.weightTotal = JSON.parse(req.query.weightTotal); 

或者如果它只是一个数字,更快的parsing是:

 req.query.weightTotal = +req.query.weightTotal; 

一个更聪明的解决scheme,如果你发送请求中的对象,将使用POST而不是GET。

尝试首先将req.query.weightTotalstring转换为对象:

 req.query.weightTotal = eval('(' + req.query.weightTotal + ')'); 

检查下面的演示。

 var obj = { x: '5581efdcc465c1ccd97a1f6b', y: '5581efe2458256f5d9848ca7', weightTotal: '{"$gt": 150}' } obj.weightTotal = eval('(' + obj.weightTotal + ')'); pre.innerHTML = JSON.stringify(obj); 
 <pre id="pre"></pre>