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

supertest运行报ReferenceError: err is not defined如何解决

错误原因

抛出ReferenceError: err is not defined是因为supertest的end()方法回调函数括号位置写错,属于基础语法错误。
你的代码中:

request.get(`users?access-token=${api_token}`).end((err,res), () =>{

在(err,res)后错误添加了右括号,把回调的参数列表提前闭合,导致JS解析器将(err,res)识别为独立的逗号表达式、将后面的() => {}识别为另一个独立的箭头函数。此时err和res既没有声明,也不属于后面箭头函数的形参,在箭头函数内部访问err时就会触发未定义引用错误。
另外你的测试描述写的是GET /user,实际请求的是/users路径,描述和实际请求不匹配,后续维护测试用例容易产生误解。

修复方案

调整end()方法回调的括号位置,将(err,res)作为箭头函数的形参放在正确位置即可,修复后的可运行代码如下:

import { describe } from "mocha";
import supertest from "supertest";
import { expect } from "chai";

const request = supertest('https://gorest.co.in/public/v2/');
const api_token = '45faa1e4b06b3cc1d5ecfbe639235376838cf638c85f88cb9bcc04e954bbf77f';

describe('GET /users' , () =>{
  it('fetching user details', (done) =>{
    request.get(`users?access-token=${api_token}`).end((err, res) =>{
       if (err) return done(err);
       console.log(res.body);  
       expect(res.body).to.not.be.empty;
       done();
    })
  })
})

优化建议

  • 回调中必须添加错误判断逻辑:如果请求本身出错(网络异常、接口返回错误状态码),直接把错误传给done(err)可以让mocha第一时间抛出真实错误,避免测试超时无有效报错信息
  • 可以用supertest内置的query()方法传参,比手动拼接URL更易维护,写法为request.get('users').query({ 'access-token': api_token })
  • mocha原生支持Promise/async await写法,不需要手动调用done()回调,代码更简洁:
it('fetching user details', async () =>{
  const res = await request.get('users').query({ 'access-token': api_token });
  console.log(res.body);
  expect(res.body).to.not.be.empty;
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:57:22