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

能否在Cypress中使用pg(Postgres Node.js包)?遇构造函数错误求助

解决Cypress中使用pg模块报错CloudflareSocket is not a constructor的问题

问题根源是你写的beforeEach代码实际运行在浏览器环境里,而非Node环境——Cypress的测试逻辑默认在浏览器上下文执行,这里没有Node的net.Socket模块,所以pg包会尝试加载CloudflareSocket,但该依赖未正确安装或不适用当前场景,导致报错。

正确的做法是把数据库操作放到Cypress的**任务(Task)**中,任务代码运行在Node环境,能正常使用pg模块:

步骤1:配置Cypress任务

修改你的cypress.config.js(或cypress.config.ts),在setupNodeEvents里注册数据库操作任务:

const { defineConfig } = require('cypress');
const { Client } = require('pg');

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      // 注册数据库操作任务
      on('task', {
        async runDbQuery() {
          const connectionString = 'postgres://someuser@localhost:5432/somedatabase';
          const client = new Client({ connectionString });
          try {
            await client.connect();
            // 替换为你的清理SQL语句
            await client.query('SELECT NOW()');
            return { success: true };
          } catch (err) {
            console.error('数据库操作失败:', err);
            throw err;
          } finally {
            await client.end();
          }
        },
      });
    },
  },
});

步骤2:在测试用例中调用任务

把原来beforeEach里的数据库操作替换为调用Cypress任务:

describe('Some Test Suite', () => {
    beforeEach(() => {
        // 调用Node环境的数据库任务
        cy.task('runDbQuery');
    });

    // 你的测试用例
    it('executes test after db setup', () => {
        // ...测试逻辑
    });
});

额外注意事项

  • 确保pg包已安装在项目根目录(不要仅安装在cypress子目录下)
  • 如果需要传递动态参数(比如不同的清理SQL),可以修改任务接收参数:
    // 任务定义
    async runDbQuery(sql) {
      // ...
      await client.query(sql);
      // ...
    }
    
    // 测试中调用
    cy.task('runDbQuery', 'TRUNCATE TABLE target_table RESTART IDENTITY;');
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:18:14