我已经在这个问题上苦苦挣扎了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无法正常工作。我知道它确实达到'/'路线,因为:
(编辑)重定向是在Mongoose的回调函数中,它不是同步的(因为NodeJS应该是)。为清楚起见,我刚刚删除了Mongoose验证内容。
我尝试添加res.end()
,但无效
我试过了
req.method = 'get';
res.redirect('/');
和
res.writeHead(302, {location: '/'});
res.end();
不起作用
我做错了什么?我怎样才能真正离开'/ login'页面,将浏览器重定向到'/'并显示它收到的HTML代码?
提前感谢一百万人的帮助:)
答案 0 :(得分:24)
问题可能不在于后端,而在于前端。如果您使用AJAX发送POST请求,则专门设计为不更改您的URL。
在AJAX的请求完成后(在window.location.href
中)使用.done()
以使用所需路径更新URL,或在收到HTML时使用JQuery:$('body').replaceWith(data)
从请求中回来。
答案 1 :(得分:1)
如果您使用异步请求后端,然后在后端重定向,它将在后端重定向(即它将创建一个新的get请求到该URL),但不会在前端更改URL。
>要使其正常工作:
windows.location.href = "/url"
<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('/');