【问题标题】:How to whitelist boolean true/false or string 'true'/'false'如何将布尔真/假或字符串“真”/“假”列入白名单
【发布时间】:2019-06-11 22:25:50
【问题描述】:

有没有办法将 expressjs 中的属性值列入白名单? IE 我想将属性值限制为布尔值 true/false 或字符串 'true'/'false'。

因为真的很烂 JS 我不能这样做

  var foo = Boolean(req.param('foo'));

因为字符串“假”的计算结果为真。

希望简化这一点,但也想知道 expressjs 或 multer/busboy 是否内置了我想念的东西:

var fooParam = req.param('foo');
var foo;
if (fooParam === 'true' || fooParam === 'false') {
  foo = fooParam === 'true;
} else if (fooParam === true || fooParam === false) {
  foo = fooParam;
}

【问题讨论】:

  • 出于好奇,什么时候可以用布尔值代替字符串true/false? JSON 请求正文?
  • 澄清一下,三个结果是:'true'true 产生foo = true'false'false 产生foo = false,以及任何其他字符串或类型产生@987654331 @?
  • 在第二个if中使用typeof fooParam === 'boolean'怎么样?
  • @Ry- 是的,它试图简单地使用一个可以使用 multipart/form-data 和 application/json 的路由。 JSON 当然是布尔值,但多部分值是字符串,所以会以“真”/“假”的形式出现。
  • 对于这个问题真的没有超级干净的解决方案,只是你已经拥有的相同东西的变化。

标签: javascript node.js express busboy


【解决方案1】:

试试这个:

let maChaine = true;
let monBooleen = JSON.parse(maChaine); 
console.log(monBooleen); //monBoolen vaut true

maChaine = 'true';
monBooleen = JSON.parse(maChaine); 
console.log(monBooleen); //monBoolen vaut true

maChaine = false;
monBooleen = JSON.parse(maChaine); 
console.log(monBooleen); //monBoolen vaut false

maChaine = 'false';
monBooleen = JSON.parse(maChaine); 
console.log(monBooleen); //monBoolen vaut false

所以,您的代码将是:

var fooParam = req.param('foo');
let foo = [true, false, 'true', 'false'].includes(fooParam)?JSON.parse(fooParam):undefined

【讨论】:

  • 除了'true''false' 之外,还有很多有效的 JSON。 '1''null''{}'[]'"foo"'都会给出意想不到的结果。
【解决方案2】:

我建议从相反的方向解决它 - 对提供的值进行字符串化并检查结果字符串:

var fooParam = req.param('foo');
// map the string value of each boolean to the corresponding boolean value
var boolMap = new Map([['true', true], ['false', false]]); 
// stringify the provided param (true\'true' => 'true', false\'false' => 'false') 
// and get the corresponding value from the mapping. 
// in case of value that is not true\'true'\false\'false' was provided, undefined will be assigned to foo.
var foo = boolMap.get(String(fooParam));

【讨论】:

  • 使用带有原型的对象存在fooParam === 'hasOwnProperty''toString'等会产生意外结果的问题。 (有时这甚至是一个漏洞。)Map 可能会更好。
  • @Ry- 我同意。感谢您的评论,编辑代码。
【解决方案3】:

我喜欢这个符号:

[true, false, 'true', 'false'].includes(req.param('foo'))

它提供了很好的可扩展性。

let result: boolean | undefined = undefined;
if ([false, 'false'].includes(req.param('foo'))) {
  result = false;
} else if ([true, 'true'].includes(req.param('foo'))) {
  result = true;
}

【讨论】:

  • 但是'false'以外的字符串也会导致false,而在作者代码中它们将是undefined
  • 你去吧,我已经编辑了答案以反映这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2012-05-13
相关资源
最近更新 更多