我正在構建一個具有登錄表單和條帶訂閱功能的 Web 應用程式。
為了接收我使用express.json的JSON 資料
app.use(express.json());
我在用上面的中間件接收stripe webhook secret的時候,服務端收不到。
所以我不得不添加express.raw
我的中間件看起來像這樣:
app.use(express.raw({ type: "application/json" }));
app.use(express.json());
但是現在我無法接收表單 JSON 資料。
這是我的條紋邏輯:
export const postStripeWebhook = async (req: ExtendedRequest, res: Response) => {
let data;
let eventType;
let event = req.body;
const webhookSecret = "web hook secret provided by stripe";
if (webhookSecret) {
let signature = req.headers["stripe-signature"];
try {
event = stripe.webhooks.constructEvent(req.body, signature , webhookSecret);
} catch (err) {
console.log(`?? Webhook signature verification failed.`); //This part is throwing the error
return res.sendStatus(400);
}
data = event.data;
eventType = event.type;
} else {
data = req.body.data;
eventType = req.body.type;
}
let subscription;
switch (eventType) {
// Here webhook events are managed
}
res.sendStatus(200);
};
這是 index.js 代碼:
app.use(express.raw({ type: "application/json" }));
app.use(express.json());
app.use(express.static("public"));
app.use(express.urlencoded({ extended: true }));
app.use(cors());
app.post("/webhooks", postStripeWebhook);
更新代碼------------------------
索引.js:
app.use(express.json());
app.use(express.static("public"));
app.use(express.urlencoded({ extended: true }));
app.use(cors());
app.post("/webhooks", postStripeWebhook);
中間件代碼:
export const postStripeWebhook = async (req: ExtendedRequest, res: Response) => {
let data;
let eventType;
let event = req.body;
const webhookSecret = "web hook secret provided by stripe";
if (webhookSecret) {
let signature = req.headers["stripe-signature"];
try {
event = stripe.webhooks.constructEvent(JSON.stringify(req.body), signature , webhookSecret); //updated this line
} catch (err) {
console.log(`?? Webhook signature verification failed.`); //This part is throwing the error
return res.sendStatus(400);
}
data = event.data;
eventType = event.type;
} else {
data = req.body.data;
eventType = req.body.type;
}
let subscription;
switch (eventType) {
// Here webhook events are managed
}
res.sendStatus(200);
};
我更新了代碼但仍然存在,但問題仍然存在。
請指導我如何修改我的中間件以接收這兩種型別的資料。
uj5u.com熱心網友回復:
這取決于你的需要
你可以bodyParser.json()在你的 api 中添加作為中間件
例如: app.post('/some/special/route/accepts_as_json', bodyParser.json() , (req,res)=>{} )
然后將其留app.use(express.raw({ type: "application/json" }));在您的索引中,如果您不提及中間件,它將是原始的,如果您提及,您將收到 jsons
uj5u.com熱心網友回復:
我的應用程式中的所有其他路由都需要express.json并且只/webhooks需要路由express.raw所以我繞過/wbhooks了路由使用express.json
這是我的做法:
索引.js
app.use((req, res, next) => {
if (req.originalUrl === "/webhooks") {
next();
} else {
express.json()(req, res, next);
}
});
app.use(express.static("public"));
app.use(express.urlencoded({ extended: true }));
app.use(cors());
app.post("/webhooks", express.raw({ type: "application/json" }), postStripeWebhook);
uj5u.com熱心網友回復:
你不需要express.raw,只需要express.json。這會決議 JSON 請求并將生成的 Javascript 物件存盤在req.body. 但是,如果要將此物件發送到stripe.webhooks.constructEvent,則必須再次對其進行字串化:
stripe.webhooks.constructEvent(JSON.stringify(req.body), sig, endpointSecret)
如果沒有JSON.stringify,您將發送[object Object],這不會被 Stripe 理解并導致觀察到的錯誤。
express.raw({type: "application/json"})將 JSONreq.body作為字串寫入,但這除了您的特殊情況外沒有用,因此我不會使用它。但是,如果 Stripe 簽名取決于 JSON 負載的確切字串格式(我會覺得很奇怪),那么您就無法避免這種情況。在這種情況下,您應該遵循 Ibrahim shamma 的建議,但將 Stripe 中間件放在express.json():
app.use(cors());
app.post("/webhooks", express.raw({type: "application/json"}), postStripeWebhook);
app.use(express.json());
app.use(express.static("public"));
app.use(express.urlencoded({ extended: true }));
這確保了“原始決議”僅針對POST /webhooks請求發生,所有其他仍然可以作為普通 JSON 進行決議。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/534601.html
標籤:节点.js表示
上一篇:將陣列傳遞給后端
