Nock:如何使用附加标头模拟请求?我收到Nock:找不到要求

时间:2018-10-18 07:41:29

标签: javascript node.js jestjs nock

我向Axios发出以下请求:

axios.get("http://request.url/app.php", {
  headers: {
    "Accept": "application/json",
    "X-Application-Key": "my-api-key",
  },
  params: {
    url: "http://some/url",
    format: "json",
    param1: 1,
    param2: 99999,
  },
});

在这里模拟:

const myAPI = nock("http://request.url/");

myAPI
  .get("/app.php")
  .query(({url}) => url === "http://some/url")
  .replyWithFile(200, path.resolve(__dirname, "my-response.json"), {
    "Content-Type": "application/json",
  });

只要请求中没有X-Application-Key,一切都可以正常工作。当X-Application-Key标头存在时,我从nock收到以下错误:

Error: Error: Nock: No match for request {
  "method": "OPTIONS",
    "url": "<request url goes here>",
    "headers": {
    "origin": "http://localhost",
      "access-control-request-method": "GET",
      "access-control-request-headers": "X-Application-Key",
      "user-agent": "Mozilla/5.0 (darwin) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/11.12.0",
      "host": "<my host goes here>",
      "content-length": 0
  }
}

我知道这与OPTIONS请求有关,但我不知道如何解决此问题。

我尝试通过以下方式使用.matchHeader()方法:

myAPI
  .get("/app.php")
  .matchHeader("Accept", () => true)
  .matchHeader("X-Mashape-Key", () => true)
  .query(({url}) => url === "http://some/url")
  .replyWithFile(200, path.resolve(__dirname, "my-response.json"), {
    "Content-Type": "application/json",
  });

但是它什么都不会改变。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。它与诺克无关。这是Axios端的问题。原来,在节点环境中调用Axios时必须使用preg_match('/function register\(.*\)\s*{/', $classFileContent, $matches, PREG_OFFSET_CAPTURE); $firstLinePos = strlen($matches[0][0]) + $matches[0][1]; $newClassFileContent = substr_replace($classFileContent, $codeToInsert, $firstLinePos, 0); 适配器。

因此解决方案是通过以下方式初始化Axios:

axios/lib/adapters/http