You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:53:11