如何使用 Stripe webhook 修复收到 404 且无法 GET 的快速路由

问题描述 投票:0回答:1

我的前端有一个 Vue 应用程序和一个只有几条路由的单独的 Express 服务器。在 app.js 中,我注册了我的路线,如下所示:

const express = require('express')
const cors = require('cors')
require('dotenv').config()
const orders = require('./routes/orders')
const webhooks = require('./routes/webhooks')
const app = express()

// http://expressjs.com/en/4x/api.html#express.urlencoded
app.use(cors())
app.use(express.json())
app.use(express.urlencoded({ extended: true }))


// Register api routes
app.use('/', orders)
app.use('/create-payment-intent', orders)
app.use('/admin', orders)
app.use('/admin/:id', orders)
app.use('/webhook', webhooks)
/*
TODO - fall through route handler
*/

在/routes/orders.js中

const express = require('express')
const router = express.Router()
const { flattenObject, orderValidationRules, validate } = 
require('../middlewares/validations')
const OrdersController = require('../controllers/ordersController')


router.route('/').post(
  orderValidationRules(),
  validate,
  OrdersController.apiPostOrder
  )
router.route('/admin').get(OrdersController.apiGetOrders)
router.route('/create-payment-intent').post(OrdersController.apiCreatePaymentIntent)
router.route('/:id').delete(OrdersController.apiDeleteOrder)

module.exports = router

/路线/webhooks

const express = require('express')
const router = express.Router()
const WebhooksController = require('../controllers/webhooksController')

router.route('/webhook').post(express.raw({type: 'application/json'}), 
WebhooksController.apiPostWebhookEvent)

module.exports = router

在前端,我可以发布订单,点击管理路由,到达服务器上的创建支付意图路由并响应 200,但是当我看到条纹仪表板上是否到达 webhook 时,显示待处理且在服务器上404 未找到:

[![在此处输入图像描述][1]][1]

这是一个快速路由问题,我不确定我是否确实正确设置了路由。我该如何解决?另外,在服务器的本地主机端口上,我无法获取 /create- payment-intent 和 /webhook,/admin 没问题。 [1]:https://i.stack.imgur.com/qoojq.png

javascript node.js express stripe-payments express-router
1个回答
0
投票

您的问题是,在 app.js 中您放置了一个中间件函数,该函数使用 JSON 解析传入请求

app.use(express.json())

然后在你的路线 /routes/webhooks 中传递另一个中间件

express.raw({type: 'application/json'}

要工作,请将以下内容放入 app.js 中

// Use JSON parser for all non-webhook routes
app.use(
   (
     req: express.Request,
     res: express.Response,
     next: express.NextFunction
   ): void => {
     if (req.originalUrl === '/webhook/') {
       next();
     } else {
       express.json())(req, res, next);
     }
   }
);
© www.soinside.com 2019 - 2024. All rights reserved.