我找不出为什么req.param('length')返回0的原因。

3

我正在使用基于Express框架的Sails.js,我发送了一个名为lengthform 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' }

我还在开发者控制台的网络标签中检查了一下,看到已经发送了一个名为length = "1000"的参数的POST请求。不知道我是不是漏掉了什么很显然的东西,或者这是一个奇怪的故障。 为什么会出现这种情况,我该如何获得长度的值而不是得到“0”? 谢谢。

3
你尝试将 length 改名为 myLength 吗?因为 length 是一个关键字,可能会让 sails 感到困惑。 - jaumard
req.params ['length'] 能用吗? - KJ Price
1
@jaumard 嗯,当然,这就是为什么会发生这种情况。将 length 重命名为 myLength 就会返回实际值。我实际上没有考虑过重命名它!我必须提醒自己始终使用更好的名称。如果您愿意,可以将您的评论发布为答案。我认为在偶然情况下有人遇到这种情况时会很有用。哈哈,谢谢你指出这个问题! - JamHam
不用谢,把它作为答案添加即可。谢谢 ^^ - jaumard
2个回答

1
“length”是一个词,你在访问对象时应该避免使用。因此,你不应该直接访问“length”(即obj.length)。你可能需要将底层属性名称更改为安全的名称,例如@jaumard提到的quantity
<select name="quantity"></select>

然后您可以访问req.params.quantity

1
"length" 是一个属性,对吧? 我认为他的意思是你不应该使用 "length" 作为一个单词,因为它可能会与 JavaScript 的 "length" 属性冲突。 - JamHam
1
@JamHam:我可以理解在某些情况下最好避免使用 length 以避免冲突。但是这个答案似乎暗示 obj.lengthobj['length'] 之间存在差异,而事实并非如此。前者只是后者的语法糖。 - Felix Kling
@FelixKling,“没有理由避免使用length”,你真的相信吗?此外,使用字符串访问对象与使用点符号访问对象是不同的。我已经删除了关于obj['length']的部分,但我认为你有点挑剔,我的朋友。 - KJ Price
你是对的。在使用第三方代码时,最好避免某些属性名称,因为您可能不知道正在处理什么类型的对象(尽管这很容易找出)。但是,没有一般性的理由要避免 length。 “使用字符串访问对象与使用点符号访问对象不同。”您能详细说明一下吗?当然,括号表示法允许您访问无法使用点符号访问的属性,但这不适用于 length。您还有其他想法吗? - Felix Kling
我的意思是,通过点符号或括号符号访问特定属性(例如length)之间没有区别。当然,在一般情况下,点符号和括号符号之间是有区别的。 - Felix Kling
显示剩余3条评论

1
只需将您的选择器重命名为myLength,因为length是JavaScript关键字,这会使sails混淆。
编辑:
抱歉,length不是关键字,但在JavaScript中,值/对象(如字符串、数组)可以默认设置属性length
感谢Felix Kling指正。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接