我运行Swagger来测试我用NodeJS和Fastify框架编写的应用程序接口。一切正常,当我在Postman中测试我的API时,一切都正常。但在Swagger中,我得到了这个错误:
TypeError: NetworkError when attempting to fetch resource.在我搜索它之后,我发现我应该在我的代码中添加found。所以我用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?
发布于 2020-02-05 21:38:38
问题是,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()
})https://stackoverflow.com/questions/59517737
复制相似问题