Swagger尝试在Fastify NodeJS中获取资源时发送此错误:TypeError:NetworkError

时间:2019-12-29 07:59:25

标签: node.js swagger fastify

我运行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到我的代码中?

1 个答案:

答案 0 :(得分:0)

问题在于,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()
})