3

从 node.js 这按预期工作,发送一个 POST 响应(正如我使用 httpToolkit 验证的那样)

% node
> const axios = require('axios')
> var r = (async () => { const x = await axios.post('http://example.com/v1/secret/data/foo/bar/baz',{data: {foo: 42}},{headers: {'X-Special-Token': 'DATA'}}); return true;})().then(console.log)
undefined
> true

但是从jest测试中做同样的事情,axios首先发送一个 OPTIONS 请求。我正在运行的服务无法处理(不是 example.com)

const axios = require('axios');

describe('Simple Post', () => {
  test('POST', async () => {
    // Axios HERE seems to send an OPTIONS request first...
    const x = await axios.post('http://example.com',
      {data: {foo: 42}},
      {headers: {'X-Special-Token': 'DATA'}});
    expect(x.status).toBe(200);
  });
});

有什么方法可以说服/配置jest或者axios不会axios神奇地决定发送OPTIONS吗? 这与 CORS 无关——它的服务器代码与服务器代码对话,但显然其中的某些东西axios决定了它是合适的。

4

1 回答 1

4

通读这个问题,我的问题的解决方案就是下面的标题。见开玩笑的测试环境。这个问题确实有很多关于不同问题的讨论,所以 YMMV。

/**
 * This is required to prevent axios from acting like it is in a browser
 *   environment and doing OPTIONS preflights, etc.
 *
 * @jest-environment node
 */
const axios = require('axios');

describe('Simple Post', () => {
  test('POST', async () => {
    // No preflight OPTIONS request sent when jest-environment is node
    const x = await axios.post('http://example.com',
      {data: {foo: 42}},
      {headers: {'X-Special-Token': 'DATA'}});
    expect(x.status).toBe(200);
  });
});
于 2020-08-09T14:05:53.617 回答