我正在使用API路由控制器,必须确保在请求正文中发送的count
参数是一个数字。选中typeof count
总是返回string
。
如何正确验证count
是数字?
// sample request 1 - { count: '90' }
(req, res, next) => {
const { count } = req.body;
console.log(typeof count);
// string
}
答案 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
}
}