如何解决tslint报错‘Shadowed name: 'err'’?
解析TSLint的
Shadowed name: 'err'错误 错误含义是什么?
嘿,这个问题我太熟了!这个错误本质是**变量遮蔽(variable shadowing)**导致的——你在嵌套的回调里用了和外层完全同名的err变量,内层的err会把外层的同名变量“盖住”,导致外层的err在内部作用域里根本没法被正确访问。
看你贴的这段代码:
fs.readdir(fileUrl, (err, files) => { fs.readFile(path.join(fileUrl, files[0]), function (err, data) { if (!err) { res.send(data); } }); });
外层fs.readdir的回调里的err代表“读取目录时的错误”,内层fs.readFile的回调又定义了一个同名的err(代表“读取文件时的错误”)。这时候内层的err会完全覆盖外层的,如果之后你想在readFile的回调里处理readDir的错误,根本拿不到正确的变量值,TSLint就是在提前提醒你这个容易踩的逻辑坑。
最佳解决方式
有两种实用方案,选哪种看你的代码风格:
方案1:给内层错误变量重命名(简单直接)
最快速的解决方法就是给内层的err换个有辨识度的名字,比如fileErr、readFileErr,既避免了变量遮蔽,还能让代码可读性更强——一眼就能区分开是哪个环节出的错:
fs.readdir(fileUrl, (dirErr, files) => { fs.readFile(path.join(fileUrl, files[0]), function (fileErr, data) { if (!fileErr) { res.send(data); } // 还能顺手处理外层目录读取的错误 if (dirErr) { console.error('读取目录失败:', dirErr); } }); });
方案2:用Promise/async-await重构代码(推荐)
嵌套回调不仅容易引发变量遮蔽,还会导致“回调地狱”,代码越写越乱。用util.promisify把回调式的API转成Promise,再用async-await编写,既能从根源避免变量重名,代码结构也会清爽很多:
const util = require('util'); const fs = require('fs'); const path = require('path'); // 把回调API转成Promise风格 const readDirAsync = util.promisify(fs.readdir); const readFileAsync = util.promisify(fs.readFile); async function sendFirstFile(fileUrl) { try { const files = await readDirAsync(fileUrl); const data = await readFileAsync(path.join(fileUrl, files[0])); res.send(data); } catch (err) { // 统一处理所有错误,也可以根据错误类型区分是目录还是文件的问题 console.error('处理文件失败:', err); } } // 调用函数 sendFirstFile(fileUrl);
内容的提问来源于stack exchange,提问作者bobdolan
相关产品推荐
相关产品推荐

