如何在Express中为素数校验路由添加非数字输入的自定义错误消息
你当前给路由参数inputNumber加了\d+的正则限制,只有参数为纯数字时才会命中这个处理逻辑,传入字母等非数字内容时,Express找不到匹配的路由规则,会默认返回404页面,因此你要做的是适配这类非法输入的响应。
下面给出两种常用实现方案:
方案1:统一在逻辑内做参数校验(更推荐)
移除路由的参数正则限制,在代码开头先做参数合法性校验,非法输入直接返回错误提示,修改后的完整代码如下:
// 去掉参数后的正则限制 app.get('/isprime/:inputNumber', function(request, response) { const input = request.params.inputNumber; const num = parseInt(input); // 校验参数是否为合法正整数 if (isNaN(num) || num < 1 || input !== num.toString()) { const errorHtml = ` <h1>Prime Number Check</h1> <p style="color: orangered;">错误:请传入合法的正整数作为参数,示例:<code>/isprime/7</code></p> `; // 返回400状态码表示请求参数错误 return response.status(400).send(errorHtml); } function isPrime(num) { for(var i = 2; i < num; i++) if(num % i === 0) return false; return num > 1; } let p; if(isPrime(num)) { p = '<span style="color:blue;">IS a prime number.</span>'; } else { p = '<span style="color:red;">IS NOT a prime number.</span>'; } let html = ''; html += '<h1>Prime Number Check</h1>'; html += '<p>The input parameter <b> ' + num +'</b>....'+ p+ '</p>'; response.send(html); });
方案2:新增兜底路由处理非法输入
如果你不想修改现有正常数字的处理逻辑,也可以保留原有带正则限制的路由,在其后面新增一个兜底路由专门处理非数字参数的请求:
// 原有数字参数路由保持不变 app.get('/isprime/:inputNumber(\\d+)', function(request, response) { // 你原来的逻辑完全不变 let num =parseInt(request.params.inputNumber); function isPrime(num) { for(var i = 2; i < num; i++) if(num % i === 0) return false; return num > 1; } if(isPrime(num)) { var p = '<span style="color:blue;">IS a prime number.</span>'; } else { var p = '<span style="color:red;">IS NOT a prime number.</span>'; } let html = ''; html += '<h1>Prime Number Check</h1>'; html += '<p>The input parameter <b> ' + num +'</b>....'+ p+ '</p>'; response.send(html); }); // 新增兜底路由,注意要放在原有路由之后,否则会拦截正常请求 app.get('/isprime/*', function(request, response) { const errorHtml = ` <h1>Prime Number Check</h1> <p style="color: orangered;">错误:请传入合法的正整数作为参数,示例:<code>/isprime/7</code></p> `; response.status(400).send(errorHtml); });
两种方案都可以实现你要的效果,当访问localhost:3000/isprime/four时就会返回对应的错误提示。
内容的提问来源于stack exchange,提问作者Koshila Dodantenna
相关产品推荐
相关产品推荐

