【问题标题】:Proper way to parse Boolean query string param in node/express在节点/快递中解析布尔查询字符串参数的正确方法
【发布时间】:2016-09-20 16:10:39
【问题描述】:

我正在等待来自前端的类似以下内容

....?isUpdated=true

所以我在代码中做了这样的事情(因为我只处理isUpdated=true,false 需要被忽略)

var isUpdated = (req.query.isUpdated === 'true')

但我觉得有点奇怪。

如何以正确的方式做到这一点?我的意思是从查询字符串中解析一个布尔参数。

【问题讨论】:

  • 你做对了。
  • Boolean(req.query.isUpdated) 不行吗?
  • @Vaulstein 否,因为Boolean("false") 将评估为真。毕竟,它是一个有效的字符串; )

标签: javascript node.js express query-string


【解决方案1】:

Docs 如果您使用的是查询字符串

const queryString = require('query-string');

queryString.parse('foo=true', {parseBooleans: true});
//=> {foo: true}

【讨论】:

    【解决方案2】:

    对于你的方法,我唯一要改变的就是让它不区分大小写:

    var isUpdated = ((req.query.isUpdated+'').toLowerCase() === 'true')
    

    如果你愿意,你也可以把它变成一个实用函数:

    function queryParamToBool(value) {
      return ((value+'').toLowerCase() === 'true')
    }
    var isUpdated = queryParamToBool(req.query.isUpdated)
    

    【讨论】:

      【解决方案3】:

      我用这对线:

      let test = (value).toString().trim().toLowerCase(); let result = !((test === 'false') || (test === '0') || (test === ''));

      【讨论】:

        【解决方案4】:

        这是我将查询参数作为布尔值获取的通用解决方案:

        const isTrue = Boolean((req.query.myParam || "").replace(/\s*(false|null|undefined|0)\s*/i, ""))
        

        它将查询参数转换为字符串 然后通过抑制任何虚假字符串进行清理。 任何生成的非空字符串都是true

        【讨论】:

        • 对于 null 或未定义的字符串不定义 isTrue 会有什么变化?
        【解决方案5】:

        你可以使用qs

        解析int和布尔值的小代码

        qs.parse(request.querystring, {
              decoder(str, decoder, charset) {
                    const strWithoutPlus = str.replace(/\+/g, ' ');
                    if (charset === 'iso-8859-1') {
                      // unescape never throws, no try...catch needed:
                      return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
                    }
        
                    if (/^(\d+|\d*\.\d+)$/.test(str)) {
                      return parseFloat(str)
                    }
        
                    const keywords = {
                      true: true,
                      false: false,
                      null: null,
                      undefined,
                    }
                    if (str in keywords) {
                      return keywords[str]
                    }
        
                    // utf-8
                    try {
                      return decodeURIComponent(strWithoutPlus);
                    } catch (e) {
                      return strWithoutPlus;
                    }
                  }
        })
        

        【讨论】:

          【解决方案6】:
          var myBoolean = (req.query.myParam === undefined || req.query.myParam.toLowerCase() === 'false' ? false : true)
          

          【讨论】:

            【解决方案7】:

            根据之前答案的一些想法,我最终也使用此函数来考虑未定义的值

            const parseBool = (params) => {
             return !(
               params === "false" ||
               params === "0" ||
               params === "" ||
               params === undefined
             );
            };
            

            【讨论】:

            • 有点奇怪parseBool(undefined) 为假而parseBool(null) 为真
            • 是的,可能是因为没有检查 null,因此否定了该值
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多