2

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

4

1 回答 1

0

问题是onSend钩子在同一上下文中为每个请求运行。

因此,当客户端向http://localhost:3000/docsretuned发出请求时,它payload是一个文本text/html,而不是 JSON。检查fastify 的生命周期

因此,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-02-05T13:38:38.043 回答