2017-08-07 234 views
0

我正在使用XHR请求调用我的后端。这里是我的前端代码:Express res.redirect()返回HTML而不是重定向

var makeRequest = function(method, url, callback) { 
    var xhr = new XMLHttpRequest(); 
    xhr.onreadystatechange = function() { 
    if (xhr.readyState === 4 && xhr.status === 200) { 
     callback(xhr.responseText); 
    } 
    }; 
    xhr.open(method, url); 
    xhr.send(); 
} 

document.getElementById('button').addEventListener('click', function() { 
    makeRequest('GET', '/spotify', console.log); 
}); 

这里是为/spotify路线我的后端代码:

const Querystring = require('querystring'); 

module.exports = (req, res) => { 
    const queries = Querystring.stringify({ 
    client_id: process.env.SPOTIFY_ID, 
    response_type: 'code', 
    redirect_uri: 'http://localhost:3000/redirect' 
    }); 
    res.redirect(`https://accounts.spotify.com/authorize?${queries}`); 
}; 

而不是重定向,页面的HTML被重定向到从XHR函数返回。如果我没有点击按钮(通过像localhost:4000/spotify之类的东西)去路线,它的工作原理是我想要的,并且我被重定向。

任何想法为什么会发生这种情况?

+0

似乎你在这里使用反引号? => res.redirect('https://accounts.spotify.com/authorize?$ {queries}'); –

+0

这可能会造成什么区别?试用没有,并得到相同的行为。 –

+0

@DavidR - [这不是问题](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals) – Quentin

回答

1

这是正常和预期的行为。

重定向意味着“您请求的内容已在此处”。

重定向不是的意思是“浏览器应该加载这个URL作为一个新的页面”。

您从XMLHttpRequest发出请求。这意味着XMLHttpRequest将处理响应。服务器表示它应该从其他URL获取内容,因此XMLHttpRequest获取该URL并在其对象中提供数据。

+0

啊好吧,这是有道理的。如果请求来自XHR请求,那么是否有可能执行后端重定向?我想在将数据传回我的XHR回调之前在后端重定向几次。 –

+0

我不知道“后端重定向”是什么。无法检测到XHR的请求。您可以在请求中添加额外的数据,以告诉服务器沿着另一条路径走下去。 – Quentin

0

这只是因为XHR按照每个普通请求处理重定向。 如果您尝试将一个正常的XHR请求(在您的JS控制台中)带到一个以重定向响应的页面,浏览器会将您重定向到该页面,如果这是XHR请求或正常请求,则无关紧要。

相关问题