gpt4 book ai didi

node.js - 在 Nest.js 中访问 Stripe webhook 的原始主体

转载 作者:搜寻专家 更新时间:2023-10-30 21:05:07 25 4
gpt4 key购买 nike

我需要在我的 Nest.js 应用程序中访问来自 Stripe 的 webhook 请求的原始主体。

正在关注 this例如,我将以下内容添加到具有需要原始主体的 Controller 方法的模块中。

function addRawBody(req, res, next) {
req.setEncoding('utf8');

let data = '';

req.on('data', (chunk) => {
data += chunk;
});

req.on('end', () => {
req.rawBody = data;

next();
});
}

export class SubscriptionModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(addRawBody)
.forRoutes('subscriptions/stripe');
}
}

在 Controller 中,我使用 @Req() req 然后使用 req.rawBody 来获取原始主体。我需要原始主体,因为 Stripe api 的 constructEvent 正在使用它来验证请求。

问题是请求卡住了。似乎既没有为数据也没有为结束事件调用 req.on。所以 next() 没有在中间件中被调用。

我也尝试使用 raw-bodyhere但我得到了几乎相同的结果。在那种情况下,req.readable 总是错误的,所以我也被困在那里。

我想这是 Nest.js 的问题,但我不确定...

最佳答案

对于寻找更优雅解决方案的任何人,请关闭 main.ts 中的 bodyParser。创建两个中间件函数,一个用于 rawbody,另一个用于 json-parsed-body

json-body.middleware.ts

import { Request, Response } from 'express';
import * as bodyParser from 'body-parser';
import { Injectable, NestMiddleware } from '@nestjs/common';

@Injectable()
export class JsonBodyMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: () => any) {
bodyParser.json()(req, res, next);
}
}

原始体.middleware.ts

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';
import * as bodyParser from 'body-parser';

@Injectable()
export class RawBodyMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: () => any) {
bodyParser.raw({type: '*/*'})(req, res, next);
}
}

将中间件函数应用于 app.module.ts 中的适当路由。

app.module.ts

[...]

export class AppModule implements NestModule {
public configure(consumer: MiddlewareConsumer): void {
consumer
.apply(RawBodyMiddleware)
.forRoutes({
path: '/stripe-webhooks',
method: RequestMethod.POST,
})
.apply(JsonBodyMiddleware)
.forRoutes('*');
}
}

[...]

并调整 Nest 的初始化以关闭 bodyParser:

ma​​in.ts

[...]

const app = await NestFactory.create(AppModule, { bodyParser: false })

[...]

顺便说一句,req.rawbody 很久以前就已经从 express 中删除了。

https://github.com/expressjs/express/issues/897

关于node.js - 在 Nest.js 中访问 Stripe webhook 的原始主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54346465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com