提问人:Brayan Vinicius Jordan 提问时间:8/23/2023 最后编辑:Manuel SpigolonBrayan Vinicius Jordan 更新时间:8/24/2023 访问量:110
有人可以帮我在 FASTIFY 中创建一个 HOOK 以在所有app.ts端点中自动序列化这些类型的值吗?
Could someone help me to create a HOOK in FASTIFY to automatically serialize these types of values in all app.ts endpoints?
问:
有人可以帮我在 FASTIFY 中创建一个 HOOK 以在所有app.ts端点中自动序列化这些类型的值
我设法使用 .toString 解决了这个问题,但我想要一种方法在所有请求中自动执行此操作
答:
1赞
Manuel Spigolon
8/24/2023
#1
首先,JS标准函数不支持bigint:
const big = { n: :1231231231231231213n }
console.log(typeof big.n) // bigint
JSON.stringify(big) // TypeError: Do not know how to serialize a BigInt
JSON.parse('{"n":1231231231231231213}') // { n: 1231231231231231200 }
这里有 3 个解决方案:
- 设置一个 JSON 模式响应,Fastify 将通过将它们转换为数字来为您完成!
- 使用 hook 获取序列化的所有权。请注意,返回的是一个字符串,而不是一个数字
preSerialization
toString
- 使用 获取序列化的所有权。方法不同,但结果与以前相同。
setReplySerializer
我会使用可以完全控制序列化的东西,因为实用程序不支持序列化 bigint,并且解析 json 的客户端必须意识到它,否则它将失败!
请参阅上面的代码片段,修剪数字。JSON.*
JSON.parse()
const app = require('fastify')({ logger: true })
app.get('/solution-1', {
schema: {
response: {
200: {
type: 'object',
properties: {
n: { type: 'number' }
}
}
}
}
}, async (request, reply) => {
return { n: 1231231231231231213n } // prints {"n":1231231231231231200} (not a string 🚀)
})
app.register(function plugin (app, opts, next) {
app.addHook('preSerialization', async (request, reply, payload) => {
payload.n = payload.n.toString()
return payload
})
app.get('/solution-2', async (request, reply) => {
return { n: 1231231231231231213n } // prints {"n":"1231231231231231213"}
})
next()
})
app.register(function plugin (app, opts, next) {
app.setReplySerializer(function (payload, statusCode) {
return JSON.stringify(payload, (key, value) =>
typeof value === 'bigint'
? value.toString()
: value
)
})
app.get('/solution-3', async (request, reply) => {
return { n: 1231231231231231213n } // prints {"n":"1231231231231231213"}
})
next()
})
app.listen({ port: 8080 })
curl http://localhost:8080/solution-1
curl http://localhost:8080/solution-2
curl http://localhost:8080/solution-3
评论