如何从指定JavaScript文件中读取testData对象的键值对?
解决方案:读取每个JS文件中的testData属性
我来帮你实现遍历文件并提取每个文件里testData的tags和setup属性的逻辑!这里推荐用Node.js内置的vm模块来安全执行文件代码,比正则表达式更可靠,能应对不同格式的testData定义。
以下是修改后的完整index.js代码:
let fs = require("fs") const glob = require("glob"); const vm = require("vm"); // 导入内置的vm模块 var getDirectories = function (src, callback) { glob(src + '/**/*.js', callback); }; getDirectories('tests', function (err, res) { if (err) { console.log('Error', err); return; } var listOfFiles = res; for (let filePath of listOfFiles){ try { // 1. 读取文件内容 const fileContent = fs.readFileSync(filePath, 'utf8'); // 2. 创建一个空的上下文对象,用来承载执行后的变量 const context = {}; // 3. 在新上下文里执行文件代码,把testData挂载到context中 vm.runInNewContext(fileContent, context); // 4. 提取testData的属性 if (context.testData) { const { tags, setup } = context.testData; console.log(`文件 ${filePath} 的信息:`); console.log(`- Tags: ${tags}`); console.log(`- Setup: ${setup}`); console.log('---'); // 这里可以添加你的后续逻辑,比如存储到数组或数据库 } else { console.log(`文件 ${filePath} 中未找到testData对象`); } } catch (error) { console.log(`处理文件 ${filePath} 时出错:`, error.message); } } });
代码细节解释:
- 导入
vm模块:Node.js内置模块,用于在隔离的上下文环境中执行代码,既不会污染当前进程的全局变量,又能安全获取文件内定义的变量。 - 读取文件内容:用
fs.readFileSync同步读取文件(遍历场景下同步逻辑更直观,若处理超大文件可改用异步的fs.readFile)。 - 执行文件代码:
vm.runInNewContext会在独立的上下文里运行文件代码,把文件里的testData变量绑定到我们创建的context对象上。 - 提取属性并处理:先检查
context中是否存在testData,再解构出tags和setup做打印或其他业务逻辑。 - 错误处理:用
try-catch包裹整个文件处理流程,避免单个文件出错导致整个遍历中断。
替代方案(正则表达式):
如果不想用vm模块,也可以用正则匹配属性值,但这种方式对testData的格式要求严格(比如属性值必须是单/双引号包裹),示例代码如下:
// 遍历循环内的替代逻辑 const fileContent = fs.readFileSync(filePath, 'utf8'); const tagsMatch = fileContent.match(/tags:\s*['"](.*?)['"]/); const setupMatch = fileContent.match(/setup:\s*['"](.*?)['"]/); if (tagsMatch && setupMatch) { const tags = tagsMatch[1]; const setup = setupMatch[1]; console.log(`文件 ${filePath}:tags=${tags}, setup=${setup}`); } else { console.log(`文件 ${filePath} 无法匹配到tags或setup`); }
⚠️ 注意:正则方案容易失效,比如当属性值里包含引号、换行或者属性定义格式变化时(比如用模板字符串),就会匹配失败,所以优先推荐vm模块的方案。
内容的提问来源于stack exchange,提问作者IRAP
相关产品推荐
相关产品推荐

