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

Cypress集成AWS Secrets Manager报错:global is not defined

解决Cypress中集成AWS SDK Secrets Manager时的"global is not defined"错误

问题根源

AWS SDK v2依赖Node.js环境的global对象,但Cypress的测试代码运行在浏览器上下文,浏览器中没有这个全局变量,因此导入SDK时直接触发报错。


解决方案1:在Cypress中模拟global对象

在Cypress的支持文件(cypress/support/e2e.js 或 cypress/support/index.js)中添加以下代码,提前为浏览器环境注入global对象:

// 模拟Node.js的global对象,适配AWS SDK v2
if (typeof global === 'undefined') {
  window.global = window;
}

添加后再导入你的Secrets Manager代码,就能正常运行了。

解决方案2:改用AWS SDK for JavaScript v3

AWS SDK v3采用模块化设计,原生适配浏览器环境,无需依赖global这类Node.js特定对象,是更推荐的方案:

  1. 安装v3版本的Secrets Manager客户端:
npm install @aws-sdk/client-secrets-manager
  1. 重构你的Secrets Manager代码:
import { SecretsManagerClient, GetSecretValueCommand } from "@aws-sdk/client-secrets-manager";

class SecretsManager {
  static async getSecret(secretName: string, region: string) {
    const client = new SecretsManagerClient({ region });
    try {
      const response = await client.send(new GetSecretValueCommand({ SecretId: secretName }));
      if (response.SecretString) {
        return response.SecretString;
      }
      const buff = Buffer.from(response.SecretBinary as Uint8Array, 'base64');
      return buff.toString('ascii');
    } catch (err: any) {
      console.log(err);
      if ([
        'DecryptionFailureException',
        'InternalServiceErrorException',
        'InvalidParameterException',
        'InvalidRequestException',
        'ResourceNotFoundException'
      ].includes(err.code)) {
        throw err;
      }
    }
    return null;
  }
}

export default SecretsManager;

解决方案3:通过Cypress任务在Node.js环境中调用AWS SDK

Cypress任务运行在Node.js环境,天然支持AWS SDK v2,可把密钥获取逻辑转移到任务中:

  1. 在cypress.config.js中注册任务:
const { defineConfig } = require('cypress');
const AWS = require('aws-sdk');

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      on('task', {
        async getSecret({ secretName, region }) {
          const secretsManager = new AWS.SecretsManager({ region });
          try {
            const secretValue = await secretsManager.getSecretValue({ SecretId: secretName }).promise();
            if (secretValue.SecretString) {
              return secretValue.SecretString;
            }
            const buff = new Buffer(secretValue.SecretBinary, 'base64');
            return buff.toString('ascii');
          } catch (err) {
            console.log(err);
            if ([
              'DecryptionFailureException',
              'InternalServiceErrorException',
              'InvalidParameterException',
              'InvalidRequestException',
              'ResourceNotFoundException'
            ].includes(err.code)) {
              throw err;
            }
            return null;
          }
        }
      });
    },
  },
});
  1. 在测试文件中调用该任务:
describe('测试获取密钥', () => {
  it('获取Secrets Manager中的密钥', async () => {
    const secret = await cy.task('getSecret', { secretName: '你的密钥名称', region: '你的区域' });
    // 在这里使用secret进行后续测试操作
  });
});

内容的提问来源于stack exchange,提问作者Aditya Bhardwaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:07:34