麻烦在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.weightTotal
string转换为对象:
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>