NodeJS 带有绝对url前缀的超级代理

h7appiyu  于 2023-06-29  发布在  Node.js
关注(0)|答案(2)|浏览(115)

我注意到,每次我想用superagent运行节点测试时,我都在编写http://localhost

import superagent from 'superagent';

const request = superagent.agent();
request
  .get('http://localhost/whatever')
  .end((err, res) => { ... });

有没有办法避免localhost部分?
我所做的就是避免将请求硬编码到主机:

const baseUrl = 'http://localhost:3030';

request
  .get(`${baseUrl}/whatever`)

但我还是要随身携带的baseUrl与代理每一次。

sqserrrh

sqserrrh1#

虽然最近没有像superagent-absolute那样更新软件包,但superagent-prefix是官方推荐的,并且截至2020年采用率最高。
It is such a simple package,我不会担心缺乏更新。
示例用法:

import superagent from "superagent"
import prefix from "superagent-prefix"

const baseURL = "https://foo.bar/api/"
const client = superagent
  .agent()
  .use(prefix(baseURL))
hjqgdpho

hjqgdpho2#

TL;DR:superagent-absolute正是这样做的。
详细内容:

您可以在superagent之上创建一个抽象层。

function superagentAbsolute(agent) {
  return baseUrl => ({
    get: url => url.startsWith('/') ? agent.get(baseUrl + url) : agent.get(url),
  });
}

当使用起始/调用时,将覆盖agent.get

global.request = superagentAbsolute(agent)('http://localhost:3030');

现在,您需要为以下对象执行相同的操作:DELETE、HEAD、PATCH、POST和PUT。
https://github.com/zurfyx/superagent-absolute/blob/master/index.js

const OVERRIDE = 'delete,get,head,patch,post,put'.split(',');
const superagentAbsolute = agent => baseUrl => (
  new Proxy(agent, {
    get(target, propertyName) {
      return (...params) => {
        if (OVERRIDE.indexOf(propertyName) !== -1 
            && params.length > 0 
            && typeof params[0] === 'string' 
            && params[0].startsWith('/')) {
          const absoluteUrl = baseUrl + params[0];
          return target[propertyName](absoluteUrl, ...params.slice(1));
        }
        return target[propertyName](...params);
      };
    },
  })
);

或者你可以简单地使用superagent-absolute

const superagent = require('superagent');
const superagentAbsolute = require('superagent-absolute');

const agent = superagent.agent();
const request = superagentAbsolute(agent)('http://localhost:3030');

it('should should display "It works!"', (done) => {
  request
    .get('/') // Requests "http://localhost:3030/".
    .end((err, res) => {
      expect(res.status).to.equal(200);
      expect(res.body).to.eql({ msg: 'It works!' });
      done();
    });
});

相关问题