我在这个问题上苦苦挣扎了两天,尽我所能地用谷歌搜索和 stackoverflow 搜索,但我无法解决。
我正在构建一个简单的节点应用程序(+ Express + Mongoose),其登录页面重定向到主页。这是我的服务器 JS 代码:
app
.get('/', (req, res) => {
console.log("Here we are : root");
return res.sendfile(__dirname + '/index.html');
})
.get('/login', (req, res) => {
console.log("Here we are : '/login'");
return res.sendfile(__dirname + '/login.html');
})
.post('/credentials', (req, res) => {
console.log("Here we are : '/credentials'");
// Some Mongoose / DB validations
return res.redirect('/');
});
登录页面向
/credentials
发出POST请求,在其中验证发布的数据。这有效。我可以在 Node 控制台中看到“我们在这里:'/credentials'”。
问题来了:res.redirect 无法正常工作。我知道它确实到达了“/”路线,因为:
(编辑)重定向位于 Mongoose 的回调函数中,它不是同步的(NodeJS 应该是同步的)。为了清楚起见,我刚刚删除了 Mongoose 验证内容。
我尝试添加
res.end()
,但不起作用
我已经尝试过了
req.method = 'get';
res.redirect('/');
和
res.writeHead(302, {location: '/'});
res.end();
不起作用
我做错了什么?我怎样才能真正离开“/login”页面,将浏览器重定向到“/”并显示它收到的 HTML 代码?
提前感谢一百万您的帮助:)
问题可能不在于后端,而在于前端。如果您使用 AJAX 发送 POST 请求,它是专门设计的,不会更改您的 url。
AJAX 请求完成后(在
window.location.href
中)使用 .done()
将 URL 更新为所需路径,或者在收到请求返回的 HTML 时使用 JQuery:$('body').replaceWith(data)
。
如果您使用异步请求到后端,然后在后端重定向,它将在后端重定向(即,它将创建一个到该 URL 的新 get 请求),但不会更改前端的 URL。
要使其发挥作用,您需要:
window.location.href = "/url"
<a></a>
)几乎可以肯定,您正在进行异步调用来检查 Mongoose,但您尚未构建代码,以便仅在异步调用返回结果后才会发生重定向。
在 javascript 中,
POST
看起来像这样:
function validateCredentials(user, callback){
// takes whatever you need to validate the visitor as `user`
// uses the `callback` when the results return from Mongoose
}
app.post('/credentials', function(req, res){
console.log("Here was are: '/credentials'";
validateCredentials(userdata, function(err, data){
if (err) {
// handle error and redirect to credentials,
// display an error page, or whatever you want to do here...
}
// if no error, redirect
res.redirect('/');
};
};
您还可以看到诸如 node.js 中的异步调用与 mongoose 对于并行/相关问题的问题...
我一直致力于使用 Express 将 Nodemailer 实现到我的 NextJS 应用程序中。遇到这个问题并遇到了这个。我的函数中有 event.preventDefault() ,它正在触发要提交的表单,并且也阻止了重定向,我将其取下并相应地进行了重定向。
我知道这是较旧的,并且投票的答案确实有用;我只是想更进一步,展示使用 JavaScript
fetch
调用调用 api 时我做了什么。
假设我的后端做了
res.redirect('/newpage')
;前端检查响应中的 redirected
标志,如果为 true,则转到重定向的 url:
后端(node.js Express)
router.get('/oldpage', function(req, res) {
res.redirect('/newpage');
});
前端(JavaScript)
const api = await fetch('/oldpage');
if (api.redirected) {
window.location.href = api.url;
}
我不知道这是否是最好的解决方案,但检查
redirected
然后应用网址对我来说效果很好。
在您的获取/路线中添加以下内容:
res.setHeader("Content-Type", "text/html")
您的浏览器将呈现文件而不是下载它