Javascript ExpressJS:res.redirect()不起作用。如何在单页应用程序中重定向? 问题:
我有一个静态单页应用程序,其中我按下提交输入,使用Axios将POST请求从Vue组件发送到Express服务器,我在其中处理POST并尝试重定向到另一个页面,但Javascript ExpressJS:res.redirect()不起作用。如何在单页应用程序中重定向? 问题:,javascript,express,vue.js,Javascript,Express,Vue.js,我有一个静态单页应用程序,其中我按下提交输入,使用Axios将POST请求从Vue组件发送到Express服务器,我在其中处理POST并尝试重定向到另一个页面,但res.redirect(“/home”)和/或res.sendFile(path.join(u dirname,../dist/index.html”)不重定向 预期行为: 提交后,我想重定向到/home。 其他一切都很好 服务器文件: 我构建Vue CLI应用程序,以便获得dist文件夹。在dist文件夹中,我有一个包含整个应用程序
res.redirect(“/home”)
和/或res.sendFile(path.join(u dirname,../dist/index.html”)代码>不重定向
预期行为:
提交后,我想重定向到/home
。
其他一切都很好
服务器文件:
我构建Vue CLI应用程序,以便获得dist
文件夹。在dist
文件夹中,我有一个包含整个应用程序的index.html
发送POST请求的Vue组件:
我试着写尽可能少的代码。在你的发帖路线中,你已经返回了一些东西
app.post("/dhcpIP", function (req, res) {
// check if request body is empty
if (req.body.constructor === Object && Object.keys(req.body).length === 0)
return;
// doing things that work
res.redirect('/'); // this doesn't work
});
return语句结束函数执行。也就是说:您正在返回“一些有用的东西”,然后使用res.redirect
方法,该方法被忽略,因为函数已经在post路径中返回了一个值,您已经返回了一些东西
app.post("/dhcpIP", function (req, res) {
// check if request body is empty
if (req.body.constructor === Object && Object.keys(req.body).length === 0)
return;
// doing things that work
res.redirect('/'); // this doesn't work
});
return语句结束函数执行。也就是说:您正在返回“一些有用的东西”,然后使用res.redirect
方法,该方法被忽略,因为函数已经返回了一个值我已经通过使用解决了问题。
显然,如果您正在执行AXIOS post,则无法从Express服务器重定向,必须使用AXIOS方法处理重定向。
我还没有找到关于这个主题的任何解释或文档。当我这样做时,我将更新此答案。
我是这样做的:
服务器文件:
Vue组件:
我已经用计算机解决了这个问题。
显然,如果您正在执行AXIOS post,则无法从Express服务器重定向,必须使用AXIOS方法处理重定向。
我还没有找到关于这个主题的任何解释或文档。当我这样做时,我将更新此答案。
我是这样做的:
服务器文件:
Vue组件:
请改用router.push()
,因为您不是在重定向,而是在使用路由器
如果您希望通过重定向离开SPA,则可以根据服务器响应更改window.location,在这种情况下,从服务器发送301或302,并为其添加axios拦截器
请改用router.push()
,因为您不是在重定向,而是在使用路由器
如果您希望通过重定向离开SPA,则可以根据服务器响应更改window.location,在这种情况下,从服务器发送301或302,并为其添加axios拦截器
我认为问题在于您的Vue组件没有处理重定向。原则上,如果它能与浏览器或用于测试API的程序一起工作,您可以尝试一下。我将对此进行研究。任何其他信息都会有所帮助。这是一个SPA,因此实际上只有一条路由/home
,其他路由由javascript处理。您可以向他发送index.html文件res.sendFile(path.join(\uu dirname,“../dist/index.html”)代码>@Ifaruki它不起作用。它将html文件作为对象发送回客户端,但页面不会更改。甚至输入也没有刷新。我认为问题在于您的Vue组件没有处理重定向。原则上,如果它能与浏览器或用于测试API的程序一起工作,您可以尝试一下。我将对此进行研究。任何其他信息都会有所帮助。这是一个SPA,因此实际上只有一条路由/home
,其他路由由javascript处理。您可以向他发送index.html文件res.sendFile(path.join(\uu dirname,“../dist/index.html”)代码>@Ifaruki它不起作用。它将html文件作为对象发送回客户端,但页面不会更改。甚至输入也不会刷新。不是真的,不是。if
语句检查我接收的内容是否为空,如果为空,则返回并结束函数执行。只要我在POST请求中发送一些东西,我在该if-return
语句之后拥有的整个代码就可以正常工作res.redirect()
或res.sendFile()
都会将响应发送回Axios请求,因此函数不会在if-return
处结束。不是真的。if
语句会检查我接收到的内容是否为空,如果为空,则返回并结束函数执行。只要我在POST请求中发送一些东西,我在该if-return
语句之后拥有的整个代码就可以正常工作res.redirect()
或res.sendFile()
都会将响应发送回Axios请求,因此函数不会以if-return
结束。请编辑您的答案并解释为什么您的解决方案比我的好?还包括一些示例代码?谢谢。另外,我不想离开SPA。我为什么要那样?你的回答对我来说很含糊。想进一步解释吗?我不知道如何使用router.push()
。我试过这个.router.push(currentUrl)代码>但它返回一个错误:错误:避免了到当前位置的冗余导航:“/dhcpIP”。
。你能用更多的细节来完成你的答案吗?你能编辑你的答案并解释为什么你的解决方案比我的好吗?还包括一些示例代码?谢谢。另外,我不想离开SPA。我为什么要那样?你的回答对我来说很含糊。想进一步解释吗?我不知道如何使用router.push()
。我试过了
import Vue from "vue";
import VueRouter from "vue-router";
import Home from "../views/Home.vue";
Vue.use(VueRouter);
const routes = [
{
path: "/",
redirect: "/home",
component: Home,
},
{
path: "/home",
name: "Home",
component: Home,
},
{
path: "/dhcpIP",
name: "DHCP",
component: () => import(/* webpackChunkName: "dhcpIP" */ "../views/DHCP.vue")
},
];
const router = new VueRouter({
mode: "history",
// base: process.env.BASE_URL,
routes,
});
export default router;
app.post("/dhcpIP", function (req, res) {
// check if request body is empty
if (req.body.constructor === Object && Object.keys(req.body).length === 0)
return;
// doing things that work
res.redirect('/'); // this doesn't work
});
app.post("/dhcpIP", function (req, res) {
// check if request body is empty
if (req.body.constructor === Object && Object.keys(req.body).length === 0)
return;
// doing things that work
if(errors.length != 0) {
res.sendStatus(500);
} else
res.sendStatus(200);
});
sendData: function() {
if (this.ssid === "" || this.password === "") return;
let currentUrl = window.location.pathname;
server
.post(currentUrl, { ssid: this.ssid, password: this.password })
.then(res => {
if(res.status == 200) {
alert("Settings have been saved.");
window.location = currentUrl;
} else {
alert("Something went wrong. Please try again");
}
})
.catch(err => {
console.log(err);
});
}