写代码时,函数传参出错是最常见的“坑”之一。尤其是在做内网穿透这类网络工具开发或调试时,一个参数传错,可能直接导致连接失败、权限异常,甚至服务崩溃。与其靠打印一堆日志猜问题,不如掌握几个实用的参数调试技巧。
用默认值兜底,避免 undefined 闹剧
有时候调用函数的人忘了传某个参数,结果运行时突然报错。比如写一个配置内网穿透隧道的函数:
function createTunnel(port, protocol, enableHttps) {
if (enableHttps === true) {
console.log('启用 HTTPS 加密');
}
// 其他逻辑
}
如果调用时漏了第三个参数,enableHttps 就是 undefined,条件判断就失灵了。加个默认值立马稳住:
function createTunnel(port, protocol = 'http', enableHttps = false) {
// 后续逻辑更可靠
}
打印参数类型,一眼看出“传错了”
有时你传了个字符串,函数却期待布尔值。这种隐式转换容易埋雷。简单粗暴的方法是在函数开头打个日志:
console.log('参数类型:', typeof port, typeof protocol, typeof enableHttps);
或者更进一步,用 Object.prototype.toString 判断数组或 null:
console.log('port 值为:', port, ',类型是:', Object.prototype.toString.call(port));
利用解构赋值 + 默认值,清晰又安全
当参数多于三个,用对象传参更清晰。比如配置一个复杂的穿透规则:
function setupProxy({ host = '127.0.0.1', port = 8080, ssl = false, timeout = 30000 } = {}) {
// 即使整个配置对象没传,也能兜住
}
这样调用时不容易搞混顺序,也方便扩展新参数。
使用 TypeScript 提前拦截错误
如果你的项目支持 TypeScript,直接给参数加类型,编译阶段就能发现传参错误:
function createTunnel(config: { port: number; ssl: boolean }): void {
// ...
}
编辑器会立刻标红错误调用,省去很多运行时调试时间。
临时加个参数检查函数
对于关键路径的函数,可以写个简单的校验:
function validateTunnelConfig({ port, host }) {
if (!port || port < 1 || port > 65535) {
throw new Error('非法端口:' + port);
}
if (typeof host !== 'string') {
throw new Error('host 必须是字符串');
}
}
在函数开头调用一下,问题马上暴露。
善用浏览器或 Node.js 调试器
别总依赖 console.log。在函数第一行打个 debugger,然后用 Chrome DevTools 或 VS Code 启动调试,可以直接看到每个参数的值和类型,还能一步步执行,比打印强太多。
这些技巧看似简单,但在实际排查内网穿透配置失败、连接超时等问题时,往往能快速定位是不是参数传错了。与其花半小时猜问题,不如一开始就写得更健壮。