Node.js斐波那契接口传n=9报Maximum call stack size exceeded的原因是什么?
报错原因分析
核心诱因
你遇到的栈溢出问题不是n=9的合法请求触发的,而是浏览器默认发送的favicon.ico图标请求导致的,结合代码逻辑漏洞形成了无限递归:
- 参数校验存在疏漏:当请求没有携带
n参数时,qdata.n为undefined,parseInt(undefined)返回NaN,而NaN <= 0的判断结果为false,会直接进入斐波那契计算逻辑。 - 非法入参触发无限递归:
NaN传入斐波那契函数后,num <= 1的判断永远返回false,函数会持续递归调用fibonacci(NaN - 1)(结果还是NaN),递归没有终止条件,最终抛出栈溢出错误。
你查看服务端打印的console.log(n)输出,会发现除了你传入的9之外,还会输出一个NaN,就是favicon.ico请求对应的参数值。
修复方案
- 完善参数校验逻辑,将原有校验代码:
if (n <= 0)
修改为:
if (isNaN(n) || n <= 0)
确保非法数值参数直接返回错误。
- 增加无效请求过滤,在解析url后新增favicon请求拦截逻辑:
let parsedUrl = url.parse(req.url, true); // 新增favicon请求拦截 if (parsedUrl.pathname === '/favicon.ico') { res.end(); return; } var qdata = parsedUrl.query;
内容的提问来源于stack exchange,提问作者eraser
相关产品推荐
相关产品推荐

