【问题标题】:Validate node request body param type验证节点请求正文参数类型
【发布时间】:2018-10-01 05:32:51
【问题描述】:

我正在开发一个 API 路由控制器,我必须确保在请求正文中发送的 count 参数是一个数字。检查typeof count 总是返回string

如何正确验证 count 是一个数字?

// sample request 1 -  { count: '90' }

(req, res, next) => {
  const { count } = req.body;

  console.log(typeof count);
  // string
}

【问题讨论】:

  • 也许使用 Number.isNaN?
  • 如果从正文中记录它会怎样? console.log(typeof req.body.count)
  • 为什么是 NaN?简单的解决方案是检查 typeof。更复杂的是获得一些库来做到这一点。
  • 你应该检查这个npmjs.com/package/joi
  • @RIYAJKHAN 检查一个简单的值太过分了

标签: javascript


【解决方案1】:

简单的检查是使用typeof

const request = {val:4};
console.log(typeof request.val === 'number'); // true

问题会来这里:

console.log(typeof Number.NaN === 'number'); // true
console.log(typeof new Number(5) === 'number'); // false

对于更复杂的解决方案,你可以试试这个。

function isNumberStrict(num) {
    const check = num && typeof num.valueOf === 'function' ? num.valueOf() : num;
    return typeof check === 'number' && Number.isFinite(check);
}


console.log(isNumberStrict('4')); // false
console.log(isNumberStrict(Number.NaN)); // false
console.log(isNumberStrict(5)); // true
console.log(isNumberStrict(new Number(4))); //true

如果你需要(想要)你可以从npm得到这个

npm i is-number-strict

【讨论】:

    【解决方案2】:

    我通过将 qty 参数解析为 JSON 然后检查解析参数的类型来解决此验证问题:

    (req, res, next) => {
      const { count } = req.body;            //  count = '1'  ||  'one'
      parsedCount = JSON.parse(count);      //   count =  1   ||  SyntaxError: Unexpected token o in JSON at position 0
      console.log(typeof parsedCount)        //   'number'
      // 'number'
    }
    

    但是,只要qty 不可解析,这就会终止应用程序。为了解决这个问题,我使用了一个帮助函数,它返回解析后的qty,然后可以使用 typeof 进行验证:

    const jsonParse = arg => {
      let parsed
      try {
        parsed = JSON.parse(arg);
      } catch (err) {
          // logger(err);
      }
      return parsed;
    }
    (req, res, next) => {
      const { count } = req.body;            //  count = '1'  ||  'one'
    
      if (typeof jsonParse(qty) === 'number'){
        next();
      } else {
        // send error message
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      相关资源
      最近更新 更多