我尝试使用Express和MongoDB编写Node.js Web API。我从GET请求动态解析req.query对象(Express&#39s的查询字符串存储/解析器)并更新名为" query"的对象。使用查询字符串对,我可以在数据库集合中找到与查询字符串参数匹配的文档。例如,a
localhost:3000 // users?name = John& last = Smith将修改查询对象,以便我们只查找名称字段为John,最后一个字段为Smith的记录。我们也可以不发送这些参数,只发送一个或更多。问题是当我尝试发送这样的查询字符串时:
localhost:3000 //用户?_id = 1
这什么都不返回。当我使用终端(windows cmd)直接访问数据库并运行此查询(db.Users.find({_ id:1}))时,它工作正常并按预期返回。此外,console.log(query._id)返回1,所以我知道对象正在存储我期望的参数。
var query = {};
//Iterate through query string parameters as a Get request
//Add them to the query object, (add them as object properties)
for(var propName in req.query) {
query[propName] = req.query[propName];
}
db.collection("Users", function(err, collection) {
if(!err) {
collection.find(query, {limit: 100},function(err, cursor) {
if(!err) {
cursor.toArray(function(err, arr) {
if(!err) {
console.log(arr);
res.send(arr);
} else {
console.log("Failed to turn cursor to array: "+err);
}
});
} else {
console.log("Find failed: "+err);
}
});
} else {
console.log("Failed opening collection: "+err);
}
});
答案 0 :(得分:3)
这是因为MongoDB文档中的_id
值是1
,但是您使用字符串'1'
查询它(所有req.query
字段都是字符串)。
可能的解决方案是将字段解析为数字:
if (propName === '_id') {
query[propName] = parseInt(query[propName], 10);
}
或者使用像Mongoose这样的东西,它会根据模式定义为你做这种渲染。