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

NodeJS中使用Newman运行多集合时无法更新环境变量文件

问题原因

你当前的代码是并行执行两个Newman集合,每个集合都直接读取原始环境文件,彼此完全独立运行。第一个集合修改的变量(无论环境还是全局)仅存在于自身运行上下文,既不会自动写入环境文件,也不会传递给第二个集合,所以第二个集合只能读到初始值。

解决方法

要实现变量共享,需串行执行集合,并且将前一个集合运行后更新的变量传递给下一个集合,而非每次都读取原始文件。具体步骤如下:

1. 改用串行执行逻辑

forEach是并行执行,必须改成串行,确保第一个集合跑完再启动第二个,这样才能拿到更新后的变量。

2. 传递更新后的环境变量

不再每次传入原始环境文件路径,而是在第一个集合运行完成后,获取更新后的环境变量对象,作为第二个集合的environment参数传入。

修改后的代码

const newman = require('newman');
const fs = require('fs');

// 读取原始环境文件并转为对象
const environmentFile = './FeatureTesting_Variables.postman_environment.json';
let currentEnv = JSON.parse(fs.readFileSync(environmentFile, 'utf8'));

const collections = [
    './IndividualCollection/SignIn.postman_collection.json',
    './IndividualCollection/WorkSpace.postman_collection.json',
];

// 串行执行集合的异步函数
async function runCollectionsSequentially() {
    for (const collectionPath of collections) {
        await new Promise((resolve, reject) => {
            newman.run({
                collection: collectionPath,
                environment: currentEnv, // 传入当前最新的环境变量对象
                reporters: ['cli', 'htmlextra', 'json'],
                color: 'auto',
            }, (err, summary) => {
                if (err) {
                    reject(err);
                    return;
                }
                // 更新currentEnv为当前集合运行后的环境变量
                currentEnv = summary.environment.values.members.reduce((env, item) => {
                    const existingVar = env.values.members.find(v => v.key === item.key);
                    if (existingVar) {
                        existingVar.value = item.value;
                    }
                    return env;
                }, JSON.parse(JSON.stringify(currentEnv))); // 深拷贝避免污染原对象
                resolve();
            });
        });
    }
    // 可选:将最终更新的变量写回环境文件
    fs.writeFileSync(environmentFile, JSON.stringify(currentEnv, null, 2));
}

// 启动执行
runCollectionsSequentially().catch(err => {
    console.error('集合运行失败:', err);
    process.exit(1);
});

3. 关键说明

  • 串行执行:用for...of配合async/await,保证上一个集合执行完成后再启动下一个。
  • 变量传递:每次运行都传入当前最新的环境变量对象,确保第二个集合能获取第一个集合修改后的clientHandshakeToken。
  • 深拷贝处理:避免直接修改原环境对象,防止上下文数据污染。
  • 可选写回文件:如果需要将最终更新的变量持久化到环境文件,保留fs.writeFileSync步骤即可。

额外提示

如果使用全局变量共享,逻辑类似:在第一个集合跑完后,从summary.globals提取更新后的变量,传递给下一个集合的globals参数即可。

内容的提问来源于stack exchange,提问作者Shahroz Ahmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:16:09