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
相关产品推荐
相关产品推荐

