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

在Cypress中使用mysql2连接MySQL数据库时遇TypeError错误求助

解决Cypress中使用mysql2连接数据库的TypeError问题

核心问题原因

Cypress测试代码默认在浏览器环境中执行,而mysql2是基于Node.js开发的数据库驱动,依赖Node.js专属的net模块实现TCP连接。浏览器环境没有该模块,因此触发TypeError: Net.connect is not a function错误。


解决方案一:使用Cypress Task(推荐)

Cypress的Task功能允许在Node.js环境中执行代码,完美适配mysql2这类Node.js库。

1. 配置Task(Cypress 10+)

修改cypress.config.js,注册数据库操作的Task:

const { defineConfig } = require("cypress");
const mysql2 = require('mysql2/promise'); // 用Promise版本适配异步流程

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      on('task', {
        async updateDeveloperStatus(email) {
          // 建立数据库连接
          const connection = await mysql2.createConnection({
            host: '127.0.0.1',
            port: 3306, // 单独指定端口,不要拼在host里
            user: 'root',
            password: 'rootpassword',
            database: 'main_backendless'
          });

          try {
            // 执行更新操作
            const [results] = await connection.execute(
              'UPDATE `Developer` SET `developerStatusId` = ? WHERE `email` = ?',
              ['1', email]
            );
            return results.affectedRows;
          } finally {
            // 确保连接关闭
            await connection.end();
          }
        }
      });
    },
  },
});

2. 在测试代码中调用Task

修改测试用例,替换直接调用mysql2的逻辑:

it('register new users allowed and update status in the database', () => {
  // 表单填写、提交、跳转验证逻辑不变...
  cy.url().should('include', '/login');

  // 通过Task执行数据库更新
  cy.task('updateDeveloperStatus', 'testuser@example.com').then(affectedRows => {
    expect(affectedRows).to.equal(1);
  });
});

解决方案二:使用cy.exec()执行外部脚本

如果不想修改Cypress配置,可以写独立的Node.js脚本处理数据库操作,再通过cy.exec()调用。

1. 编写数据库操作脚本

创建update-db.js文件:

const mysql2 = require('mysql2/promise');

async function updateDeveloperStatus(email) {
  const connection = await mysql2.createConnection({
    host: '127.0.0.1',
    port: 3306,
    user: 'root',
    password: 'rootpassword',
    database: 'main_backendless'
  });

  try {
    const [results] = await connection.execute(
      'UPDATE `Developer` SET `developerStatusId` = ? WHERE `email` = ?',
      ['1', email]
    );
    // 用退出码标识执行结果
    process.exit(results.affectedRows === 1 ? 0 : 1);
  } finally {
    await connection.end();
  }
}

// 从命令行参数获取邮箱
updateDeveloperStatus(process.argv[2]);

2. 在测试代码中调用脚本

it('register new users allowed and update status in the database', () => {
  // 表单操作逻辑不变...
  cy.url().should('include', '/login');

  // 执行外部脚本验证结果
  cy.exec('node update-db.js testuser@example.com').then(result => {
    expect(result.code).to.equal(0); // 脚本执行成功返回0
  });
});

额外注意事项

  • 连接配置规范:不要把端口拼在host字段中,单独使用port参数,避免解析错误。
  • 异步流程适配:优先使用mysql2/promise版本,避免回调嵌套导致的Cypress异步同步问题。
  • 资源清理:无论哪种方案,都要确保数据库连接最终关闭,避免资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:25:26