我正在使用nodejs和mongoDB进行项目。在get方法中,客户端发送一个OData uri作为例子
http://localhost:8080/persons?$filter=name eq 'test'
现在我想在我的应用程序中转换mongoDB对象中$ filter的结果,如此
var filter = {"name" : "test"}
并将该对象放在像这样的查找查询中
db.collection.find(filter)
这只是一个简单的例子,但在我的应用程序中,它更复杂。见http://www.odata.org/documentation/odata-version-2-0/uri-conventions
我问是否存在一个npm模块,或者我必须手动完成一些复杂的事情。 Bref,我要求更好的解决方案。
谢谢
答案 0 :(得分:-1)
好的,这有两个方法,这取决于你需要如何使用GET请求,正如你在你提供的链接中看到的那样,请求是由一个URL形成的,tha是直到第一个/,然后是路径,这是斜杠(/)之间的所有参数,最后是查询,这是“?”之后的所有内容。
你在问题中说的是你需要在一个查询参数中嵌入一个完整的查询,唯一有用的用例就是如果你将其他查询参数用于其他事情(即使有一些重新思考)应该做的是处理更简单的任务)。无论如何,如果这是你需要它的方式,我会建议用你需要的查询发送一个urlencoded JSON.strigify处理对象然后和urldecode,解析服务器端,这是最简单的方法。 http://www.yourDomain.com/persons?$滤波器=%7B%22name%22%3A%22test%22%7D
app.get("/persons", function(req, res){
console.log(req.query); // Should output {filter : "%7B%22name%22%3A%22test%22%7D"}
var query = req.query;
query = decodeURIComponent(query.filter);
query = JSON.parse(query);
db.collection("persons").find(query).toArray(function(error, result){
if(error){
res.status(500).send("Database problem");
} else if(result.length == 0){
res.status(204).send("No content");
} else {
res.json({result : result}); // Embedded in an object for security reasons
}
});
});
另一方面,如果您需要查询,那就是全部,那么您的自我更加复杂。使用GET请求的正确方法就是执行查询,例如: http://www.yourDomain.com/persons?name=test
如果你这样做并使用像express这样的框架,那么这是最容易的事情......在路径解析器中,你从请求对象中获取查询,就是这样,例如:
app.get("/persons", function(req, res){
console.log(req.query); // Should output {name : "test"}
db.collection("persons").find(req.query).toArray(function(error, result){
if(error){
res.status(500).send("Database problem");
} else if(result.length == 0){
res.status(204).send("No content");
} else {
res.json({result : result}); // Embedded in an object for security reasons
}
});
});