ExpressJS:res.redirect() 没有按预期工作?

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

我在这个问题上苦苦挣扎了两天,尽我所能地用谷歌搜索和 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 无法正常工作。我知道它确实到达了“/”路线,因为:

  1. 我可以在 Node 控制台中看到“Here we are : root”
  2. index.html 页面作为响应发送回浏览器,但未显示在窗口中。 Chrome 检查器显示 POST 请求响应,我可以在检查器中看到 HTML 代码发送到浏览器,但 URL 仍然是 /login 并且登录页面仍然显示在屏幕上。

(编辑)重定向位于 Mongoose 的回调函数中,它不是同步的(NodeJS 应该是同步的)。为了清楚起见,我刚刚删除了 Mongoose 验证内容。

我尝试添加

res.end()
,但不起作用

我已经尝试过了

req.method = 'get'; 
res.redirect('/');

res.writeHead(302, {location: '/'});
res.end();

不起作用

我做错了什么?我怎样才能真正离开“/login”页面,将浏览器重定向到“/”并显示它收到的 HTML 代码?

提前感谢一百万您的帮助:)

node.js http-redirect express
6个回答
57
投票

问题可能不在于后端,而在于前端。如果您使用 AJAX 发送 POST 请求,它是专门设计的,不会更改您的 url。

AJAX 请求完成后(在

window.location.href
中)使用
.done()
将 URL 更新为所需路径,或者在收到请求返回的 HTML 时使用 JQuery:
$('body').replaceWith(data)


6
投票

如果您使用异步请求到后端,然后在后端重定向,它将在后端重定向(即,它将创建一个到该 URL 的新 get 请求),但不会更改前端的 URL。

要使其发挥作用,您需要:

  1. 使用
    window.location.href = "/url"
  2. 将异步请求(在前端)更改为简单的锚标记(
    <a></a>

0
投票

几乎可以肯定,您正在进行异步调用来检查 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 对于并行/相关问题的问题...


0
投票

我一直致力于使用 Express 将 Nodemailer 实现到我的 NextJS 应用程序中。遇到这个问题并遇到了这个。我的函数中有 event.preventDefault() ,它正在触发要提交的表单,并且也阻止了重定向,我将其取下并相应地进行了重定向。


0
投票

我知道这是较旧的,并且投票的答案确实有用;我只是想更进一步,展示使用 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
然后应用网址对我来说效果很好。


-2
投票

在您的获取/路线中添加以下内容:

  res.setHeader("Content-Type", "text/html")

您的浏览器将呈现文件而不是下载它

© www.soinside.com 2019 - 2024. All rights reserved.