Express中res.location(path)无作用?Location头未修改求助
兄弟,我之前也踩过这个坑!咱先把事儿说透:res.location() 只是帮你把Location响应头设置好,但它不会自动发送重定向对应的状态码,也不会完成响应的最终发送。你现在用了res.location()之后直接调用res.end(),Express默认会发送200的状态码——浏览器看到200(成功响应),根本不会去理会Location头,自然就没效果啦!
接下来给你几个针对性的解决方案:
1. 如果你是想实现页面重定向(跳转到/new-header)
直接用Express封装好的res.redirect()就完事了,它会自动帮你设置Location头和对应的3xx状态码(默认是302临时重定向),代码改成这样:
app.get('/sub-link/:wildcard', (req, res) => { res.redirect('/new-header'); });
完全不用手动写res.location()和res.end(),省心又不容易出错。
2. 非要手动控制状态码和响应头的话
如果你就是想自己把控整个流程,那必须先设置重定向状态码(比如301永久重定向、302临时重定向),再调用res.end(),代码如下:
app.get('/sub-link/:wildcard', (req, res) => { res.status(302) // 先设置重定向状态码 .location('/new-header') // 设置Location头 .end(); // 完成响应发送 });
只有当状态码是3xx的时候,浏览器才会读取Location头并执行跳转操作。
3. 换成res.render的情况(你的最终需求)
如果你是要渲染handlebars的app页面,而不是跳转页面,那其实res.location()在这里是多余的——因为res.render()会自动发送200状态码和渲染后的页面内容,这时候即使设置了Location头,浏览器也不会触发跳转(毕竟200是成功响应,浏览器会直接展示渲染好的页面)。
所以你的最终代码可以直接写成:
app.get('/sub-link/:wildcard', (req, res) => { // 传入你需要的模板数据 res.render('app', { pageTitle: '自定义标题', content: '页面内容' }); });
如果真的有特殊需求,要在渲染页面的同时带上Location头(这种场景很少见),也可以这么写,但浏览器不会触发跳转哦:
app.get('/sub-link/:wildcard', (req, res) => { res.location('/new-header') .render('app', { pageTitle: '自定义标题', content: '页面内容' }); });
总结一下:res.location()只是单纯设置响应头,必须配合3xx状态码才能让浏览器触发跳转;如果是渲染页面的场景,这个方法基本用不上~
内容的提问来源于stack exchange,提问作者ravo10

