我一直在閱讀有關CORS和飛行前請求的資訊,并且已經了解它基本上是一種OPTIONS在發出實際請求之前發送的請求,如果服務器允許,則再次發送實際請求。但最讓我困惑的是瀏覽器如何能夠在沒有收到服務器實際回應的情況下接收回應標頭?無論是否發送了回應,是否都會發送標頭??就像在下面的nodejs代碼片段中一樣,您可以看到我創建了一個middleware接收OPTIONS請求并使用發送實際請求所需的標頭進行回應的物件。一旦它在同一個上被驗證login路由瀏覽器發送實際請求。但你一定是注意到我不發送回應從處理器中的選項中間件功能,我只發送標題。那么這一切如何仍然有效?標題如何在沒有回應的情況下發送到瀏覽器?
app.options("/login", (req, resp, next) => {
resp.header("Access-Control-Allow-Origin", "http://127.0.0.1:5500");
resp.header("Access-Control-Allow-Methods", "GET, POST, PUT");
resp.header("Access-Control-Allow-Headers", "Content-type");
next();
});
app.post("/login", (req, resp) => {
resp.header("Access-Control-Allow-Origin", "http://127.0.0.1:5500");
resp.header("Access-Control-Allow-Methods", "GET, POST, PUT");
resp.header("Access-Control-Allow-Headers", "Content-type");
resp.json({
msg:"Sucess"
});
});
uj5u.com熱心網友回復:
要回答這個問題,您需要查看 express 源代碼。在router\index.js(在您next()從處理程式呼叫后最終會執行)中,您將找到以下代碼:
// for options requests, respond with a default if nothing else responds
if (req.method === 'OPTIONS') {
done = wrap(done, function(old, err) {
if (err || options.length === 0) return old(err);
sendOptionsResponse(res, options, old);
});
}
在您的情況下, if 條件為 false ,因為您沒有在處理程式中回應導致呼叫sendOptionsResponse,其定義如下:
// send an OPTIONS response
function sendOptionsResponse(res, options, next) {
try {
var body = options.join(',');
res.set('Allow', body);
res.send(body);
} catch (err) {
next(err);
}
}
這就是為什么即使您沒有明確地從處理程式發送回應,實際上也會發送回應的原因。
順便說一句:您可能想看看cors-package,它極大地有助于促進 cors-setup。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/391387.html
標籤:节点.js 表达 科斯 http-headers http-方法
