由于 If-None-Match 標頭中收到的 etag 值,我如何確定回應狀態是否為 304(未修改)?我想記錄此資訊,但無法在節點服務器中獲取它。似乎 express 自己處理這個:
https://expressjs.com/en/api.html#express.static
uj5u.com熱心網友回復:
如果您要做的只是在發送回應后記錄最終狀態代碼,則可以偵聽該finish事件,然后檢查res.statusCode. 這是一個簡單的例子:
const express = require('express');
const app = express();
app.get("/", (req, res) => {
res.sendFile("temp.html", { root: __dirname });
res.on('finish', () => {
console.log(`finish event: ${res.statusCode}`);
});
});
app.listen(80);
運行這個服務器然后請求/第一次記錄200,第二次記錄304。
uj5u.com熱心網友回復:
Express,express.static()從serve-static模塊中獲取。該模塊呼叫send模塊從這里和模塊使用的fresh模塊從這里這是它似乎測驗ETAG這里。
這是fresh()函式:
function fresh (reqHeaders, resHeaders) {
// fields
var modifiedSince = reqHeaders['if-modified-since']
var noneMatch = reqHeaders['if-none-match']
// unconditional request
if (!modifiedSince && !noneMatch) {
return false
}
// Always return stale when Cache-Control: no-cache
// to support end-to-end reload requests
// https://tools.ietf.org/html/rfc2616#section-14.9.4
var cacheControl = reqHeaders['cache-control']
if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl)) {
return false
}
// if-none-match
if (noneMatch && noneMatch !== '*') {
var etag = resHeaders['etag']
if (!etag) {
return false
}
var etagStale = true
var matches = parseTokenList(noneMatch)
for (var i = 0; i < matches.length; i ) {
var match = matches[i]
if (match === etag || match === 'W/' etag || 'W/' match === etag) {
etagStale = false
break
}
}
if (etagStale) {
return false
}
}
// if-modified-since
if (modifiedSince) {
var lastModified = resHeaders['last-modified']
var modifiedStale = !lastModified || !(parseHttpDate(lastModified) <= parseHttpDate(modifiedSince))
if (modifiedStale) {
return false
}
}
return true
}
要呼叫fresh()自己以自己獲取此值,您必須能夠將確切的標頭傳遞給它serve-static,然后send才能傳遞它。這也可能是可行的,但你必須通過跟蹤如何express-static()和send()他們傳遞到之前設定的回應頭fresh()。
僅供參考,這引出了“為什么”您要這樣做的問題?你想解決什么問題?也許有更好的方法來解決真正的問題。就您現在的問題而言,這有點像XY 問題,您提出了有關您嘗試解決某個問題的方法的問題,但沒有告訴我們實際問題是什么。實際問題可能有更好/更簡單的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/370567.html
