背景

今天在写单元测试时,调用 supertestpost 方法时,IDE 智能提示显示它只有一个 url 参数。我以为是文档没有写全,因为我还要传其他数据呢,该从哪里传进去呢?

这就是一个思维定势,来自平时使用 fetch 函数时,要传递的数据写在第二个参数 options 里。

我决定看一下源代码,心想文档不给予传递其他数据怎么写的说明,看源代码总能找出来。然后看到这段代码:

// supertest.js
// ...
 for (const method of methods) {
    obj[method] = url => {
      // support pathFor(url)
      if (url[0] !== '/') {
        const realUrl = app.router.pathFor(url);
        if (!realUrl) throw new Error(`Can\'t find router:${url}, please check your \'app/router.js\'`);
        url = realUrl;
      }

//      ...

我惊呆了,真的只接受一个参数!

我只能去看 supertest 官方文档,查看了 post 使用示例。发现是这样调用的:

    request(app)
      .post('/user')
      .send('name=john') // x-www-form-urlencoded upload
      .set('Accept', 'application/json')
      //...

总结

看完示例恍然大悟,原来数据通过后续 send 方法发出。原来传递数据不一定非得通过传进第二个参数,还可以通过返回一个能再次接收数据传输的对象来实现!这是个什么对象呢?哈哈哈,是一个发送 http 请求的 request 对象啦。