node express:如何确定给定 etag 状态是否为 304

node express: how to find out if status will be 304 given etag

由于 If-None-Match header 中收到的 etag 值,我如何才能确定响应状态是否为 304 (Not-Modified)?我想记录这些信息,但无法在节点服务器中获取它。似乎快递自己处理这个:

https://expressjs.com/en/api.html#express.static

Express,从 serve-static module. That module calls the send module from here and that module uses the fresh module from here which is where it seems to test the eTag here.

中获取其 express.static()

这是 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-staticsend 的确切 headers 传递给它会通过它。这可能是可行的,但在将它们传递给 fresh().

之前,您必须跟踪 express-static()send() 如何设置响应 headers

仅供参考,这引出了您“为什么”要尝试这样做的问题?你想解决什么问题?也许有更好的方法来解决真正的问题。正如你现在的问题,它有点像 XY problem,你问了一个关于你尝试解决某个问题的问题,但没有告诉我们实际问题是什么。实际问题可能有 better/easier 解决方案。

如果您要做的只是在发送响应后记录最终状态代码,您可以侦听 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。