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

时间:2014-11-29 12:12:16

标签: node.js redirect express

我已经在这个问题上苦苦挣扎了2天,用Google搜索并尽可能地堆叠,但我无法解决这个问题。

我正在构建一个简单的节点应用程序(+ Express + Mongoose),其中包含一个重定向到主页的登录页面。这是我的服务器咖啡代码:

app
     .get '/', (req, res) ->
         console.log "Here we are : root"
         res.sendfile(__dirname + '/index.html')


     .get '/login', (req, res) ->
         console.log "Here we are : '/login'"
         res.sendfile(__dirname + '/login.html')


     .post '/credentials', (req, res) ->
         console.log "Here we are : '/credentials'"

         # (here comes credentials validation stuff with Mongoose)

         res.redirect '/'

登录页面向/凭证发出POST请求,其中验证发布的数据。这有效。我可以在Node控制台中看到“我们在这里:'/ credentials'”。

然后出现问题:res.redirect无法正常工作。我知道它确实达到'/'路线,因为:

  1. 我可以在Node控制台中看到“我们在这里:root”
  2. index.html页面将作为响应发送回浏览器,但不会显示在窗口中。 Chrome检查员会显示POST请求响应,我可以在检查器中看到发送到浏览器的HTML代码,但URL仍然/登录,并且登录页面仍然显示在屏幕上。
  3. (编辑)重定向是在Mongoose的回调函数中,它不是同步的(因为NodeJS应该是)。为清楚起见,我刚刚删除了Mongoose验证内容。

    我尝试添加res.end(),但无效

    我试过了

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

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

    不起作用

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

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

6 个答案:

答案 0 :(得分:24)

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

在AJAX的请求完成后(在window.location.href中)使用.done()以使用所需路径更新URL,或在收到HTML时使用JQuery:$('body').replaceWith(data)从请求中回来。

答案 1 :(得分:1)

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

>

要使其正常工作:

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

答案 2 :(得分: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('/');
    };
};

对于并行/相关问题,您还可以查看Async call in node.js vs. mongoose等问题...

答案 3 :(得分:0)

在get / route中添加以下内容:

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

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

答案 4 :(得分:0)

我一直在使用Express将nodemailer实现到我的NextJS应用程序中。遇到这个问题并遇到了这个问题。我在我的函数中有event.preventDefault()触发了提交的表单,这也阻止了重定向,我把它取下来并相应地重定向。

答案 5 :(得分:-1)

使用if condition,您应该返回重定向行

return res.redirect('/');