angularjs - Node.js 具有不同参数的多个 get 函数

标签 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 时,它总是第一个获取,我如何区分它们或设置参数类型

最佳答案

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',
}

您不喜欢 abc 作为名称?我也没有,所以让我们改变一下:

/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/bexpress.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/

相关文章:

javascript - 如何在 Angular js 的新选项卡上显示图像或 pdf 文件?

javascript - 如何使用 Handlebars 编写一行 If 语句?

javascript - Node Express 将变量从客户端传递到服务器

node.js - Node/Express良好的错误处理方法?

javascript - 如何使用 Angular、Spring MVC 显示 JSON 数据?

javascript - 如何在 Angularjs 中获取选中的复选框值?

node.js - 声明单独的 Firebase Cloud Functions 并仍然使用 Express.js

node.js - 通过 Mongoose 使用 req.body 更新和/或添加数组元素属性?

javascript - mongodb 中带有投影字段的嵌套数组聚合查询?

javascript - 我试图打印数组索引,但是我们如何在 angularjs 中以相反的顺序进行打印