我有以下Node.js Express路线
app.get('/api/admin/elements/:type', elements.getElementsByType);
app.get('/api/admin/elements/:_id', elements.getElement);
元素功能是:
getElementsByType : function(req, res) {
element.find({
type : req.params.type
}, function(err, elements) {
if (err) {
return err;
}
res.json(elements);
});
},
getElement : function(req, res) {
var file = "/thatulborooj-data/elements/" + req.params._id + ".json";
jsonfile.readFile(file, function(err, obj) {
if (err) {
res.json([]);
} else {
res.json(JSON.parse(obj));
}
});
}
当我所有$http.get('/api/admin/elements/' + scope.element._id)
来自angularJS时,它始终是第一次获得,我如何区分它们或设置参数类型
答案 0 :(得分:3)
express.js 不知道您传递给它的变量的名称,因为它是一个侦听某些地址的网络服务器。
在你的情况下,第一条路线说:
如果有人继续/api/admin/elements/{{whatever}}
,请调用函数elements.getElementsByType()
并将任何分配给变量type
第二条路径说同样的事情,只是调用另一个函数并将值赋给var _id
。
可能的解决方案是有两条不同的路线:
app.get('/api/admin/elements/type/:type', elements.getElementsByType);
app.get('/api/admin/elements/id/:_id', elements.getElement);
另一种可能的解决方案是,如果您确定id
始终 int
且type
从不,则int为只调用一个函数并选择检查参数类型:
app.get('/api/admin/elements/:value', elements.getElementsByType);
getElementsByType : function(req, res) {
if (isNaN(req.params.value)) {
// this is a type
} else {
//this is an id
}
但我想强调一下,了解为什么你的例子不起作用很重要。
我无法解释网络在一个答案中是如何工作的,但让我强调一些事情:
express.js会在您的服务器上侦听port作为webserver的请求。你可以说express.js你想听哪条路线:所有未指定的路线都会回复404(如果你要求的方法不存在于某个资源上,则为405;如在您的示例中/api/admin/elements/{{whatever}}
发布。
因此,当您指定路线时,您有两个组成部分:
固定部分,即地址,它始终相同(如/api/admin/elements/
),以及值可以更改的部分。
你说要表达.js哪个部分可以使用:
表示法进行更改。对于express.js,/:
和下一个/
之间的URL中的任何内容都必须在您指定名称的req.params
对象中传递。
让我们举一些例子:
/a/:a/b/:b/c/:c
此地址将响应您对“/ a / {{param1}} / b / {{param2}} / c / {{param3}}
所做的每次通话所以你将拥有一个req.params
对象,其中包含以下3个值:
req.param = {
a: 'param1',
b: 'param2',
c: 'param3',
}
您不喜欢 a , b 和 c 作为名称?我也不是,所以让我们改变一下:
/a/:artemis/b/:betelgeuse/c/:cassidy
然后req.params对象将是:
req.param = {
artemis: 'param1',
betelgeuse: 'param2',
cassidy: 'param3',
}
但是对于express.js来说,它是相同的东西,它不能只根据价值来选择它。
现在,一个例子有点复杂:
如果你有
对于express.js, /a/:a
和/a/b
可能会有点令人困惑(但也适用于使用您的API的人,所以请不要这样做)。
现在,这是如何工作的,取决于你宣布路线的顺序。
如果您执行/a/:a
然后/a/b
,则永远不会调用与/a/b
相关联的功能。 express.js获取所请求的地址,并检查每条路线是否匹配。因此,如果您致电/a/b
express.js找到/a/:a
(这意味着an /a/ and a thing after this
并认为b
是变量a
的有效值。)
但是,如果您在/a/b
express.js到达/a/:a
之前(这意味着一条完全是/a/b
的路线)之前宣布/a/b
,那么它将是首先匹配。
答案 1 :(得分:2)
假设_id
应与ObjectId匹配,您可以使路由处理程序显式匹配:
app.get('/api/admin/elements/:_id([a-f0-9]{24})', elements.getElement);
app.get('/api/admin/elements/:type', elements.getElementsByType);
确保在(更一般的)_id
路线之前宣布type
路线为。
警告:如果您使用与ObjectId匹配的类型,则会中断。