2017-08-07 25 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請求或正常請求,則無關緊要。

相關問題