繁体   English   中英

Vue.js 与服务 POST 请求不兼容吗?

[英]Is Vue.js Incompatible With Serving POST Requests?

我正在尝试使用 Vue CLI 创建的 Vue.js 项目做 [事情]。 [Thing] 对这个问题不是特别重要,所以为了简洁起见,我将省略它。 我注意到当我为这个项目运行本地 Web 服务器时

$ npm run serve

GET 请求工作正常; 但是 POST 请求给了我一个 404 - “无法 POST”。 我需要能够做到这两点。

使用Express ,除了默认的router.get(...)之外,只需添加router.post(...)就可以直接使用 GET 和 POST 提供相同的页面。 然而,在 Vue.js 中这似乎很困难。

我花了一些时间玩Vue Router ,但仔细阅读文档我没有找到一个配置选项来告诉它“这是如何响应 POST 请求” - 它似乎需要 GET。

但也许我想把一个方钉撞进一个圆孔。 Vue.js 适用于在浏览器中运行的应用程序,浏览器发送 GET 请求(目前我对表单提交不感兴趣......),其中 POST 请求更像是一个 Web 应用程序/集成/后端一种东西。

你们怎么看 - 有什么明显的我遗漏了,还是我应该以“简单”的方式做到这一点并切换到 Express?

更新:我的“问题”不是 Vue.js,特别是 - 它是二进制 vue-cli-service,它肯定会监听 GET,但不会监听 POST。 (来自 Postman 的 GET 成功;来自 Postman 的 POST 失败。)如果我为部署而构建,webpack 会将项目转换为 HTML/JS/CSS,由不同的 Web 服务器提供服务并且 POST 工作得很好 - 它只是在 vue 的开发模式下-cli-service 在本地为我的应用程序提供服务,我无法使用 POST 请求。

是否有一种未公开的方式让 vue-cli-service 响应 POST 请求? 我已经搜索了文档,但没有找到任何东西。 我不确定如何让另一个 web 服务器为 Vue.js 项目提供服务,因为 webpack 配置是...复杂。

Vue Router 没有接收 (GET) 请求和响应,它只是读取当前 URL 并插入相应的组件。 所以简而言之,不,没有 POST 请求处理程序......我认为它甚至不处理 GET 请求,只是读取看起来像 GET 请求的 URL。

如果您尝试在应用程序内的页面之间进行 POST,那么 Vuex 就是您想要的。 如果您尝试从外部 POST 到您的应用程序,让实际服务器侦听您可以 ping 的请求会更容易(即 Express)。

可能有一种方法可以使用Axios从您的应用程序中执行此操作。 它可以侦听来自 POST 请求的响应,因此如果它正在侦听,我不明白为什么它无法接收。 但是,我怀疑您必须从运行您的应用程序的机器上监听端口,这将是一个主要的安全问题(如果客户端的浏览器/操作系统/防病毒软件甚至允许您)。

我发布这个问题已经快两周了,但直到我自己解决这个问题一个星期后,我才发布了这个问题。 我终于找到了一个解决方案,经过大量的主管工作和更多的死胡同,而不是我的血压重新计算的健康状况。 这里是:

  1. 决定也许我最好的选择是查看vue-cli 源代码,我碰巧注意到它包含文档
  2. docs/config 下的 README.md 文件在它关于 devserver 选项的内容中看起来有点稀疏,但它也提到了支持 webpack-dev-server 的所有选项 哦。
  3. Webpack 文档显示了一个 devserver.before 选项,该选项允许您访问 Express 应用程序对象并向其添加您自己的自定义中间件
  4. 这允许您拦截 POST 并将其重定向为 GET
  5. 这个和我有完全相同问题的人最终做到了。 (注意,他使用了 devserver.setup,它做同样的事情,但被弃用了,取而代之的是 devserver.before。)在 vue.config.js 中,包括
devServer: {
    before: function(app) {
        app.post('/about.html', function(req, res) {
          res.redirect('/about.html');
        });
    },
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM