我有以下 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 时,它总是第一个获取,我如何区分它们或设置参数类型
最佳答案
express.js 不知道您传递给它的变量的名称,因为它是一个监听某些地址的网络服务器。
在你的情况下,第一条路线说:
如果有人继续 /api/admin/elements/{{whatever}}
调用函数 elements.getElementsByType()
并将 whatever 分配给变量 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}}
上的 POST)。
因此,当您指定路线时,您有两个组成部分:
固定部分,即地址,并且始终相同(如/api/admin/elements/
),以及值可以更改的部分。
您可以使用 :
表示法向express.js 指定哪一部分可以更改。对于express.js,/:
和下一个/
之间的URL 中的任何内容都必须使用您指定的名称传递到req.params
对象中。
让我们举一些例子:
/a/:a/b/:b/c/:c
此地址将响应您对 `/a/{{param1}}/b/{{param2}}/c/{{param3}} 进行的每次调用
因此,您将拥有一个包含以下 3 个值的 req.params
对象:
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
(这意味着一个/a/以及此后的一个内容
,并且认为 b
是变量 a
的有效值)。
但是,如果您在 /a/:a
之前声明 /a/b
,express.js 将在 /a/b
之前到达(这意味着完全是 /a/b
的路由),那么它将首先匹配。
关于angularjs - Node.js 具有不同参数的多个 get 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38813100/