【问题标题】:I can't find out why req.param('length') is returning 0我不知道为什么 req.param('length') 返回 0
【发布时间】:2015-06-01 05:57:48
【问题描述】:

我正在使用 Sails.js(基于 Express),我正在发送一个名为 length 的 form input,它的 value 是 '1000',如下所示:

<select name="length">
    <option value="1000">1000</option>
</select>

服务器端,我做了一些测试,这就是我得到的

req.param('length');  // returns 0
req.params.length;    // returns 0
req.params.all()      // returns { length: '1000' }

我还检查了开发者控制台的网络选项卡,我看到正在发出POST 请求,参数为length = "1000"。

要么我遗漏了一些非常明显的东西,要么这是一个奇怪的故障。 为什么会发生这种情况?如何获得长度值而不是“0”?

谢谢。

【问题讨论】:

  • 您是否尝试通过 myLength 重命名长度?因为长度是一项关键工作,可能会让帆感到困惑
  • req.params['length'] 工作吗?
  • @jaumard 嗯,呃,这就是它发生的原因。将 length 重命名为 myLength 会返回实际值。我真的没有想过要重命名它!我必须提醒自己总是用更好的词来命名我的名字。如果需要,您可以发布您的评论作为答案。我认为它可能对某人发现自己处于这种情况的远程机会很有用。哈哈,谢谢指出!
  • 不客气,只需添加它作为答案。谢谢^^

标签: javascript node.js forms express sails.js


【解决方案1】:

只需将您的选择重命名为myLength,因为length 是一个JavaScript 关键字,这会使sails 混淆。

编辑:

抱歉length 不是关键字,但在 javascript 值/对象(如字符串、数组)中可以默认设置属性length。

感谢 Felix Kling 的更正

【讨论】:

  • length 不是关键字。如果是这样,我将无法做到var length = 42;。但即使是关键字,也允许关键字作为属性名称。
  • 也许我们可以编辑答案以反映这一点? (事实上​​它是一个属性名,但它是由'default'设置的)。
  • @JamHam:有些值具有“默认”属性length。例如字符串和数组。在这种情况下是的,您不能拥有自己的 length 属性。但是,拥有一个具有长度属性的“普通”对象是完全可以的,例如{length: 42}.
  • 这就是为什么req.params.all() 返回正确的长度值作为属性,我猜。好吧,也许这会过多地编辑答案。通过查看您的 cmets,人们可以获得正确的概念。
  • 在研究了一下午之后,事实证明上述所有 cmets 都是合理的,但最终是不完整的:这不能正常工作的原因是底层 Express 服务器解析和存储路由的方式参数。这导致req.param('length') 返回路由中通配符参数(即星号)的数量。我们目前正在修补 Sails,以允许 length 在查询字符串或正文中按预期工作(它永远不会是有效的 URL 参数,即 /foo/:length 永远不会是正常的路由)。
【解决方案2】:

“长度”是你should avoid when accessing objects的一个词。因此,您不应该尝试直接访问“长度”(即obj.length)。您可能应该将基础属性名称更改为@jaumard 提到的quantity 之类的安全名称:

<select name="quantity"></select>

然后你就可以访问req.params.quantity了。

【讨论】:

  • obj.length 和 ob['length'] 是一回事。没有理由避免使用length。
  • length 是一个属性,对吧?我认为他的意思是你不应该使用 length 作为一个词,因为它可能与 JavaScript 的 length 属性冲突。
  • @JamHam:我可以理解length 在某些情况下最好避免以避免冲突。但是这个答案似乎表明obj.length 和obj['length'] 之间存在差异,但事实并非如此。前者只是后者的语法糖。
  • @FelixKling “没有理由避免使用长度”,你真的相信吗?此外,使用字符串 访问对象 与使用点符号访问对象不同。我继续删除了关于obj['length'] 的部分,但我认为你有点挑剔了,我的朋友。
  • 你是对的。在使用第三方代码时,最好避免使用某些属性名称,因为您可能不知道正在处理哪种对象(尽管这很容易找出)。尽管如此,没有一般的理由避免length。 “使用字符串访问对象与使用点符号访问对象不同。” 想详细说明一下吗?当然,括号表示法允许您访问点表示法无法访问的属性,但这不适用于length。你还有什么其他的想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 2018-01-05
  • 2023-03-20
  • 2016-08-07
  • 2021-06-15
相关资源
最近更新 更多