【问题标题】:Replacement for req.param() that is deprecated in Express 4替换 Express 4 中已弃用的 req.param()
【发布时间】:2015-03-09 18:29:29
【问题描述】:

我们正在从 ExpressJS 3 迁移到 ExpressJS 4,我们注意到以下 API 已被弃用:

req.param(fieldName)
req.param(fieldName, defaultValue)

是否有中间件可以将这些 API 带回来,就像其他从 express 模块“外部化”到独立模块的 API 一样?

编辑: 澄清 - 需要一个 API 来提供对参数的抽象通用访问,无论它是路径参数、查询字符串参数还是正文字段。

【问题讨论】:

标签: node.js express


【解决方案1】:

基于 Express 文档,我们应该这样使用

开启express 3

req.param(fieldName)

开启express 4

req.params.fieldName

我个人更喜欢req.params.fieldName 而不是req.param(fieldName)

【讨论】:

  • 请注意它们不相等,req.param 检查 req.params、req.body 和 req.query。详情见我的回答。
  • req.params.fieldNamedoesn't work with ?=& url style...req.param() 仍然有效。
  • @sekti92 - 你没有回答这个问题。该问题最初询问的是提供了一种通用方式来访问它们的 API。
【解决方案2】:

你为什么要把它带回来?它已被弃用是有原因的,因此您可能应该远离它。

有关他们弃用 API 的原因的讨论可在他们的问题跟踪器上以#2440 获得。

该函数是一种从req.paramsreq.bodyreq.query 获取参数值的快速而肮脏的方法。在某些情况下,这当然会引起麻烦,这就是他们删除它的原因。自己看函数here

如果你只是将函数用于 url 参数,你可以将其替换为 req.query['smth'] or 'default' 的检查:

var param_old = req.param('test', 'default');
var param_new = req.query['test'] || 'default';

(请注意,一个空字符串被评估为false,所以它们实际上并不是100% 相等的。你想要什么当然取决于你,但在大多数情况下它应该无关紧要。)

【讨论】:

  • 不,我将它用于服务于不同处理程序的仪表,这些处理程序实际上可能期望它们的参数作为参数,或者查询字符串或正文参数。在这个 - 该功能完全符合我的要求。感谢您的回答和参考
  • 哦,好吧,在这种情况下,它可能是有道理的。我仍然希望这个答案可以帮助那些仅将其用于查询参数的人。
  • 是的,我想我同意。也许我们应该在 README.md 中添加一个关于这个陷阱的注释
  • 非常感谢您节省了我的时间.. :)
  • 这个答案表明大部分 express.js 用户都是不称职的业余爱好者,对吧?他们不阅读文档,也不对自己应用程序的安全性负责。这是侮辱性的 - 否决票,先生。由于荒谬的原因,一个非常有用的功能确实被弃用了。
【解决方案3】:

好的,在阅读了@Ineentho 参考文献中给出的线程后,我们决定提出以下答案:

https://github.com/osher/request-param

一个 connect/express 中间件,用于启用 express 4 中不推荐使用的 req.param(name,default) API

中间件不仅带回了老旧的功能。 它还允许您自定义从中检索参数的集合的顺序,既可以作为默认规则,也可以作为每次调用 :-)

玩得开心!

【讨论】:

  • 感谢您将您的解决方案作为中间件贡献给网络!即使我认为你的案例是一个边缘案例,其他人也可能会从这个模块中受益
猜你喜欢
  • 2014-08-11
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多