验证节点请求主体参数类型

时间:2018-09-28 09:43:20

标签: javascript

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

如何正确验证count是数字?

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

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

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

2 个答案:

答案 0 :(得分:2)

简单检查是使用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

答案 1 :(得分:0)

我通过将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
  }
}