在节点6.x中,querystring
模块将值解析为不从Object.prototype
扩展的对象(虽然我不知道为什么要进行此更改)。
考虑到这一点,检查不包含值的查询参数的预期方法是什么,即有localhost:8080/some/path?keyonly
名为express或koa的人,我想检查是否存在this.query.keyonly
?我希望我能做this.query.hasOwnProperty('keyonly')
这显然不起作用。有什么替代方案?
答案 0 :(得分:1)
看起来您可以使用Object.hasOwnProperty.call( this.query, "keyonly" )
。我设置了一些人为的测试用例,似乎有效:
const querystring = require("querystring");
const qs = "keyonly&keyvalue=valuekey";
const result = querystring.decode(url);
console.log(Object.hasOwnProperty.call( result, "keyonly" )); // true
&keyvalue=valuekey
部分不是必须的,我只想验证它不会以某种方式干扰。
答案 1 :(得分:1)
有关更改背后的背景,请参阅原始PR here。
一般情况下,您不应该依赖foo.hasOwnProperty()
,因为hasOwnProperty
可以轻松地重新分配给其他内容(因此querystring
更改的原因 - 想象某人调用您的网络服务类似于http://example.org/foo?hasOwnProperty=hahacrashed)。
作为替代方案,您可以检查属性是否已定义,例如:
var qs = querystring.parse('foo=bar');
if (qs.foo !== undefined) {
// ...
}
您还可以执行以下操作:
var qs = querystring.parse('foo=bar');
if (Object.hasOwnProperty.call(qs, 'foo')) {
// ...
}
但这并不高效,因为hasOwnProperty()
会执行额外的操作(现在querystring
不需要)检查并使用效率较低的.call()