我运行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到我的代码中?
答案 0 :(得分:0)
问题在于,onSend
挂钩针对相同上下文中的每个请求运行。
因此,当客户端向http://localhost:3000/docs
发出请求时,重新调整的payload
是text/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()
})