如何一起使用express.json和express.raw?

Paw*_*wan 2 node.js express

我正在构建一个具有登录表单和条带订阅功能的 Web 应用程序。

\n

为了接收 JSON 数据,我正在使用express.jsonas

\n
app.use(express.json());\n\n
Run Code Online (Sandbox Code Playgroud)\n

当我使用上面的中间件来接收时stripe webhook secret服务器无法接收。

\n

所以我必须添加express.raw

\n

我的中间件如下所示:

\n
app.use(express.raw({ type: "application/json" }));\napp.use(express.json());\n\n
Run Code Online (Sandbox Code Playgroud)\n

但现在我无法接收表单 JSON 数据。

\n

这是我的条纹逻辑:

\n
export const postStripeWebhook = async (req: ExtendedRequest, res: Response) => {\n    let data;\n    let eventType;\n    let event = req.body;\n    const webhookSecret = "web hook secret provided by stripe";\n    if (webhookSecret) {\n        let signature = req.headers["stripe-signature"];\n\n        try {\n            event = stripe.webhooks.constructEvent(req.body, signature , webhookSecret);\n        } catch (err) {\n            console.log(`\xe2\x9a\xa0\xef\xb8\x8f  Webhook signature verification failed.`);  //This part is throwing the error\n            return res.sendStatus(400);\n        }\n        \n        data = event.data;\n        eventType = event.type;\n    } else {\n       \n       \n        data = req.body.data;\n        eventType = req.body.type;\n    }\n    let subscription;\n\n    switch (eventType) {\n         \n       // Here webhook events are managed\n\n    }\n\n    res.sendStatus(200);\n};\n
Run Code Online (Sandbox Code Playgroud)\n

这是index.js代码:

\n
\napp.use(express.raw({ type: "application/json" }));\napp.use(express.json());\napp.use(express.static("public"));\napp.use(express.urlencoded({ extended: true }));\napp.use(cors());\n\napp.post("/webhooks", postStripeWebhook);\n\n
Run Code Online (Sandbox Code Playgroud)\n

更新了代码-------------------------

\n

索引.js:

\n
app.use(express.json());\napp.use(express.static("public"));\napp.use(express.urlencoded({ extended: true }));\napp.use(cors());\n\napp.post("/webhooks", postStripeWebhook);\n\n
Run Code Online (Sandbox Code Playgroud)\n

中间件代码:

\n
export const postStripeWebhook = async (req: ExtendedRequest, res: Response) => {\n    let data;\n    let eventType;\n    let event = req.body;\n    const webhookSecret = "web hook secret provided by stripe";\n    if (webhookSecret) {\n        let signature = req.headers["stripe-signature"];\n\n        try {\n            event = stripe.webhooks.constructEvent(JSON.stringify(req.body), signature , webhookSecret);     //updated this line\n        } catch (err) {\n            console.log(`\xe2\x9a\xa0\xef\xb8\x8f  Webhook signature verification failed.`);  //This part is throwing the error\n            return res.sendStatus(400);\n        }\n        \n        data = event.data;\n        eventType = event.type;\n    } else {\n       \n       \n        data = req.body.data;\n        eventType = req.body.type;\n    }\n    let subscription;\n\n    switch (eventType) {\n         \n       // Here webhook events are managed\n\n    }\n\n    res.sendStatus(200);\n};\n\n
Run Code Online (Sandbox Code Playgroud)\n

我更新了代码,但问题仍然存在。

\n

请指导我如何修改我的中间件以接收两种类型的数据。

\n

Paw*_*wan 5

我的应用程序中的所有其他路线都需要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);

Run Code Online (Sandbox Code Playgroud)