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

Cypress从DB获取token传入API请求体时代码运行异常求助

问题原因

你的代码无法运行核心是三个Cypress基础机制问题:

  • Cypress所有内置/自定义命令(包括cy.task、cy.ResetPassAPI)都是异步排队执行的,直接用const resetoken = cy.task(...)的写法,拿到的不是数据库查询返回的实际token字符串,而是Cypress的链式调用对象,传入请求体必然不符合接口参数要求。
  • SQL查询返回的是结果集数组,不是直接返回单个字段值,就算拿到了异步结果,不做结构解析也拿不到正确的token值。
  • 额外时序风险:重置密码接口返回后,数据库写入token可能存在毫秒级延迟,直接查库有可能拿到上一次生成的旧token。
修复代码

直接替换成如下写法即可:

it.only('Change Password', () => {
    cy.ResetPassAPI(globalThis.data.dradminemail);
    // 可选:如果接口返回后DB写入有延迟,加短等待避免查到旧数据
    cy.wait(300);
    cy.task(
      'queryDb',
      `select _Token from tokens WHERE _Member_Id = 25372 and _Token_Type = "resetPassword" ORDER BY _id DESC LIMIT 1`
    ).then((dbRes) => {
      // 从查询结果集中解析出实际token值
      const resetoken = dbRes[0]._Token;
      cy.request({
        method: 'PATCH',
        url: 'https://xxx/xx/xx/changePasswordWithToken',
        body: {
          confirmPassword: 'xxx',
          password: 'xx',
          token: resetoken,
          uid: 1234,
        },
      });
    });
  });
关键说明
  • 所有依赖Cypress命令执行结果的逻辑,必须写在对应命令的.then()回调中,Cypress会按队列顺序执行完前序操作后,把结果传入回调再执行后续逻辑,不要尝试用同步变量直接接收Cypress命令的返回值。
  • 如果你的cy.ResetPassAPI自定义命令没有等待接口响应完成就resolve,需要先给这个命令加等待逻辑,确保接口调用完成后再执行查库操作。
  • 如果查库偶尔拿不到最新token,可以把固定等待换成Cypress重试逻辑,比如循环查询直到查到生成时间晚于重置接口调用时间的token,稳定性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:48:25