/** * `registerRawBodyParser` —— JSON content-type parser,给标记了 `config.rawBody` 的路由 * 保留原始字节(Stripe webhook 验签要求未改写的 body),其余路由正常 `JSON.parse`。 * * 横切,无业务:两个 server 的装配骨架共用一份。 */ /** * @param {import('fastify').FastifyInstance} app */ export function registerRawBodyParser(app) { app.addContentTypeParser( 'application/json', { parseAs: 'buffer' }, (request, /** @type {Buffer} */ body, done) => { if (request.routeOptions?.config?.rawBody) request.rawBody = body try { const text = body.length ? body.toString('utf8') : '' done(null, text === '' ? undefined : JSON.parse(text)) } catch (err) { /** @type {any} */ (err).statusCode = 400 done(/** @type {Error} */ (err), undefined) } }, ) }