node.js - 如何防止在 Express 的 REST api 调用中使用冲突的关键字

标签 node.js api rest express

如果我正在为应用程序创建一个带有 express 的 REST api,据我所知,路由定义的顺序很重要。例如,如果我按以下顺序编写我的路线:

app.get('/users/:username', user.get);
app.get('/users/list', user.listAll);

然后 user.listAll 永远无法访问,当向“/users/list”发出请求时,服务器会将“list”分配给用户名参数。所以很明显你想颠倒这些路由的声明顺序。但是在这里,如果用户使用用户名“list”创建帐户,我们会遇到同样的问题,对吧?

那么如何防止用户使用“关键字”创建名称,其中关键字在此处定义为会与 api 路由冲突的字符串。

我可以想到两种方法,但它们似乎都不令人满意。首先,您可以保留一个字符串黑名单,您可以将其与每个用户名创建进行比较。但保持这种状态将是一场噩梦。第二,只需在数据库中预先创建这些用户(只要用户名是唯一的)。那种似乎有点老套,但我想不出很多反对它的论据。

这个问题有没有简单的解决方案?

最佳答案

好问题。我不久前遇到过这个。您一定是像我一样有网络背景,因为您正在尝试使用“slug”方法对 API 进行用户可读的调用。使用可读的 slug 很棒,实际上在网站中更受欢迎!实际上,在 API 中没有一种方法可以做到这一点我见过很多可行的方法,但我只知道一种方法可以使其具有可扩展性和描述性,几乎适用于所有用例。

始终使用 ID

  • 一个用户:/users/:id
  • 列表:/users/
  • 好友:/users/:id/friends
  • 1 个用户的 1 个 friend :/users/:id/friends/:id

以上是可扩展的并且仍然是描述性的!另外我使用版本控制。 (例如:/v1/users)。这允许我将 API 升级到 v2,同时仍然支持旧客户端:)

现在如何查找特定用户? 使用过滤器!..如何?

/v1/users?用户名=:用户名

以上将总是返回一个用户列表。如果用户名是唯一的,这仍然是一个列表,但只有 1 条记录或只是一个空列表。

使用 HTTP 方法 POST PUT GET DELETE

  • 在/users 上发布(201 个创建的用户)
  • PUT/DELETE on/users(不允许使用 400 方法)(可选择全部删除???不推荐)
  • 在/users/:id 上放置/删除(200 成功)
  • 在/users/:id 上发布(已存在 400 个用户)

希望这能解决您的问题:)

关于node.js - 如何防止在 Express 的 REST api 调用中使用冲突的关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29958887/

相关文章:

javascript - Expressjs Mongoose 查找嵌套嵌入文档未定义

javascript - GMail API Users.threads.list 缺少 "Messages"字段

rest - 如何在 Grails 2.3 中同时使用脚手架和 RESTfulness

java-me:HttpConnection 无法写入 Instagram API 请求的正文

javascript iframe 卸载

node.js - Mongoose 聚合,在产品匹配时找到产品的祖先

node.js - nodejs 从 import 转换为 require

javascript - 集成 React.js 非 JS 服务器 API

python - 编写api时需要一些建议

java - 为什么需要返回一个 Response 对象而不是 String 对象到 java 中的 http 请求?