Webpack不接受POST请求

问题描述:

我目前正在开发一个与API通信的Angular 2 Web应用程序。在应用程序中,用户可以选择付款选项,API将把url返回给付款服务。Webpack不接受POST请求

的问题是,支付服务使用POST去确认页,其中的WebPack不接受(由于某种原因,只允许GET请求),我们得到以下错误:

Cannot POST /selection/payment-method

有谁知道我们如何配置WebPack允许POST请求吗?我已经联系了支付提供商,但不可能执行GET请求而不是POST。

感谢

+0

是否运行在生产'的WebPack-DEV-server' POST请求代理的各种工作? – robertklep

+1

@robertklep没有在我们的生产服务器上生产,我们安装了nginx,它提供静态html,js和css。但是当我们正在开发时,我们需要一种方法来开发确认页面。 –

感谢@robertklep谁给我的代理文档的链接,我们找到了一种方法来处理它。我们需要做的不是处理我们需要的POST请求,而是将它转换成GET。在阅读了更多的文档后,我们发现setup:属性为webpack-dev-server配置。

通过setup:属性,您可以获得expressjs对象,并且您可以在找到指示Cannot POST /url/to/page的路线之前抓到网址。

我们结束了这一点:

devServer: { 
    setup: function(app) { 
     app.post('/selection/payment-method', function(req, res) { 
      res.redirect('/selection/payment-method'); 
     }); 
    }, 
} 

这样,我们得到了一个GET请求而不是POST和我们的应用程序的API请求,以检查是否支付成功与否。

这只用于开发!

的的WebPack-DEV-服务器仅作为唯一的前端服务器,例如。为您的静态资产提供服务。因此只支持GET请求。

如果您想要使用代理服务器或后端服务器,那么您应该实现这一点。您可以使用Express。 见how you can setup basic routing

+0

我们的应用程序只提供静态资产,并在确认页面执行API请求以检查付款是否成功。在生产中,我们使用nginx来为静态html,js和css提供服务,并且它很好。太糟糕了,webpack-dev-server不允许它。 无论如何感谢您的答案! –

+0

这不是一个很好的答案。代理的全部目的是在开发时间代理数据服务器。代理GET和POST并没有太大好处。它实际上大部分时间都是代理POST,在某些情况下我只看到它失败。 – user959690

一个的hackish方式至少不会得到404错误是代理请求/selection/payment-method并发送回一个空应答(或任何你想要的内容,我认为res是快递的Response类的实例),对于他们来说,通过增加下面以webpack.config.js

devServer: { 
    proxy: { 
    '/selection/payment-method': { 
     bypass : (req, res) => res.end() 
    } 
    } 
} 

文档here

+0

感谢您的建议!在检查了您发送的文档中的更多设置后,我们以不同的方式“破解”了它。使用代理,无论它是GET还是POST请求,请求都会被终止。 如果您使用'setup:'而不是'proxy:',您可以获得明确的对象,并且您可以在发布帖子或投入或其他任何内容时进行操作。我在示例代码中添加了示例代码。 –

基于@斯文的答案,修改设置,使之适用于所有POST整个

添加依赖于body-parsersync-request并在webpack.config.js添加需要两个依赖

var bodyParser = require('body-parser'); 
var request = require('sync-request'); 

在webpack.config.js的devServer部分

devServer: { 
     setup: function(app) { 
      app.use(bodyParser.json()); 
      app.use(bodyParser.urlencoded({ 
       extended: true 
      })); 

      app.post(/^\/(URL1|URL2|URL3)\//, function(req, res) { 
       var serviceCallResponse = request('POST', 'your app server url here' + req.originalUrl, { 
        json:req.body 
       }); 
       res.send(serviceCallResponse.getBody('utf8')); 
      }); 
     }, 
     proxy: { 
      '*/other URLs proxy/*': 'your app server url here' 
     } 
} 

更改网址1/2至要代理的URL并且你放置你的应用服务器地址。

这将为(上JSON有效载荷工作)