【问题标题】:Swagger sends this error: TypeError: NetworkError when attempting to fetch resource in Fastify NodeJSSwagger 发送此错误:TypeError: NetworkError when trying to fetch resource in Fastify NodeJS
【发布时间】:2019-12-29 07:59:25
【问题描述】:

我运行 Swagger 来测试我用 NodeJS 和 Fastify 框架编写的 API。一切都很好,当我在 Postman 中测试我的 API 时,一切都很好。但在 Swagger 中,我收到此错误:

TypeError: NetworkError when attempting to fetch resource.

在我搜索它之后,我发现我应该将 CORN 添加到我的代码中。所以我在 server.js 中写了这段代码:

fastify.addHook('onSend', (request, reply, payload, next) => {
  reply.header('Access-Control-Allow-Origin', '*')
  reply.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Access-Control-Allow-Origin, Cache-Control')
  reply.header('Access-Control-Allow-Methods', 'GET')
  Object.assign(reply.res, {
    payload: JSON.parse(payload),
    input: request.body || request.query,
  })
  next()
})

但是 Swagger 不适用于 addHook!我不知道为什么!当我将此添加到我的代码并转到此 url:localhost:3002/documentation 以查看我的 Swagger API 时,我收到此错误:

SyntaxError: Unexpected token u in JSON at position 0 at JSON.parse ()

但是当我从我的代码中评论 addHook 时,Swagger 没问题,之后我得到了第一个错误! 如何在没有 addHook 的情况下将 CORN 添加到我的代码中?

【问题讨论】:

  • 看看这个包,它可以帮助你在你的 fastify 应用上配置 CORS
  • @dimagolovin 我也测试了它:fastify.register(require('fastify-cors'), { origin: '*' }) 但我遇到了同样的问题.. :(
  • 您注释掉“addHook”并使用“fastify-cors”,但仍然得到“SyntaxError: Unexpected token u in JSON at position 0 at JSON.parse ()”?
  • no no,在这种情况下会出现此错误:TypeError: NetworkError when trying to fetch resource from swagger

标签: node.js swagger fastify


【解决方案1】:

问题在于onSend 钩子会针对同一上下文中的每个请求运行。

因此,当客户端向http://localhost:3000/docs 发出请求时,返回的payloadtext/html 的文本,而不是JSON。检查fastify's lifecycle

因此,在文本或空响应上运行 JSON.parse(payload) 会导致您收到错误。

我应该有更多信息来建议更好的方法,因为 fastify-cors 应该可以工作(它添加到您正在添加的相同标题的响应中) 所以我会改变钩子代码:

fastify.addHook('onSend', (request, reply, payload, next) => {
  reply.header('Access-Control-Allow-Origin', '*')
  reply.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Access-Control-Allow-Origin, Cache-Control')
  reply.header('Access-Control-Allow-Methods', 'GET')

  let parsed
  if (payload) {
    try { // try to parse
      parsed = JSON.parse(payload)
    } catch (error) {
      // pa
    }
  }
  Object.assign(reply.res, {
    payload: parsed,
    input: request.body || request.query
  })
  next()
})

【讨论】:

    猜你喜欢
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2022-12-01
    • 2023-02-15
    • 2016-11-13
    • 1970-01-01
    相关资源
    最近更新 更多