Jest测试本地通过但GitHub Actions失败,报JWT密钥错误
问题与解决方案
问题描述
仅一个测试用例执行失败,报错信息:
ERROR [ExceptionsHandler] secretOrPrivateKey must have a value ... at JwtService.sign
其余大量使用JwtService的测试用例均正常,本地测试也能顺利通过。已将.env配置值存入GitHub Secrets。
相关配置与代码
GitHub Actions 配置文件
name: Backend CI on: push: branches: - main jobs: build: runs-on: ubuntu-latest steps: - name: Check Out Repository uses: actions/checkout@v2 - name: Setup Node.js uses: actions/setup-node@v2 with: node-version: 18 env: MONGO_URI: ${{secrets.MONGO_URI}} JWT_SECRET_KEY: ${{secrets.JWT_SECRET_KEY}} REDIS_HOST: ${{secrets.REDIS_HOST}} REDIS_PORT: ${{secrets.REDIS_PORT}} REDIS_PASSWORD: ${{secrets.REDIS_PASSWORD}} REDIS_TLS: ${{secrets.REDIS_TLS}} NODE_ENV: 'test' - name: Install Dependencies run: npm install - name: Run Tests run: npm run test
出错的测试代码块
it('should refresh access token', async () => { const mockRefreshToken = 'mock-new-token'; authService.verifyRefreshToken.mockResolvedValue(mockCreatedUser as User); const response = await request(app.getHttpServer()) .post('/api/auth/refresh') .set('Cookie', [`refresh_token=${mockRefreshToken}`]) .expect(HttpStatus.CREATED); expect(response.body).toHaveProperty('access_token'); });
问题根因
环境变量被配置在Setup Node.js步骤的env字段中,该作用域仅局限于当前步骤,后续的Run Tests步骤无法读取到这些变量,导致JwtService初始化时获取不到JWT_SECRET_KEY,触发报错。
修复方案
将环境变量移至jobs.build层级,让整个build作业的所有步骤都能访问到这些变量:
name: Backend CI on: push: branches: - main jobs: build: runs-on: ubuntu-latest # 全局环境变量,所有步骤均可访问 env: MONGO_URI: ${{secrets.MONGO_URI}} JWT_SECRET_KEY: ${{secrets.JWT_SECRET_KEY}} REDIS_HOST: ${{secrets.REDIS_HOST}} REDIS_PORT: ${{secrets.REDIS_PORT}} REDIS_PASSWORD: ${{secrets.REDIS_PASSWORD}} REDIS_TLS: ${{secrets.REDIS_TLS}} NODE_ENV: 'test' steps: - name: Check Out Repository uses: actions/checkout@v2 - name: Setup Node.js uses: actions/setup-node@v2 with: node-version: 18 - name: Install Dependencies run: npm install - name: Run Tests run: npm run test
额外验证建议
- 在
Run Tests步骤前添加打印环境变量的命令,确认变量是否正确加载:run: echo $JWT_SECRET_KEY - 检查测试代码中是否存在覆盖环境变量的逻辑,确保测试过程中不会意外清空
JWT_SECRET_KEY
内容的提问来源于stack exchange,提问作者Mateo
相关产品推荐
相关产品推荐

