Node.js multible get函数具有不同的参数

时间:2016-08-07 10:14:49

标签: angularjs node.js express

我有以下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时,它始终是第一次获得,我如何区分它们或设置参数类型

2 个答案:

答案 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 始终 inttype 从不,则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匹配的类型,则会中断。