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特定对象,是更推荐的方案:
- 安装v3版本的Secrets Manager客户端:
npm install @aws-sdk/client-secrets-manager
- 重构你的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,可把密钥获取逻辑转移到任务中:
- 在
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; } } }); }, }, });
- 在测试文件中调用该任务:
describe('测试获取密钥', () => { it('获取Secrets Manager中的密钥', async () => { const secret = await cy.task('getSecret', { secretName: '你的密钥名称', region: '你的区域' }); // 在这里使用secret进行后续测试操作 }); });
内容的提问来源于stack exchange,提问作者Aditya Bhardwaj
相关产品推荐
相关产品推荐

