在Koa.js中,可以通过设置响应头来实现缓存控制。Koa内置的ctx.set()方法可以用于设置响应头,通过设置以下头部字段可以实现缓存控制:

  • ETag: ETag是实体标签的缩写,可以看作是表示资源的唯一标识符。服务器可以为每个资源生成一个ETag,并在后续请求中将其发送给客户端。客户端可以在发起请求时将ETag作为If-None-Match请求头发送给服务器。服务器会将ETag与当前资源的ETag进行比较,如果相同,说明资源没有修改,并返回304 Not Modified响应。这样可以避免返回相同内容的资源,减少数据传输量。

以下是一个示例,展示了如何在Koa.js中设置ETag:

router.get('/api/users/:id', ctx => {
  const { id } = ctx.params;
  // 生成ETag
  const etag = generateEtag(id);
  // 设置ETag头部字段
  ctx.set('ETag', etag);
 
  // 检查If-None-Match头部字段
  const ifNoneMatch = ctx.request.get('If-None-Match');
  if (ifNoneMatch === etag) {
    ctx.status = 304; // 返回304 Not Modified响应
    return;
  }
 
  // 返回资源内容
  const user = getUserById(id);
  ctx.body = user;
});
  • Last-Modified: Last-Modified表示资源的最后修改时间。服务器可以在响应头中设置Last-Modified字段,客户端可以在后续请求中将其作为If-Modified-Since请求头发送给服务器。服务器会将资源的最后修改时间与当前时间进行比较,如果不同,表示资源已被修改,并返回新的响应。如果相同,说明资源没有修改,并返回304 Not Modified响应。

以下是一个示例,展示了如何在Koa.js中设置Last-Modified:

router.get('/api/users/:id', ctx => {
  const { id } = ctx.params;
  const user = getUserById(id);
 
  // 设置Last-Modified头部字段
  ctx.set('Last-Modified', user.lastModified.toUTCString());
 
  // 检查If-Modified-Since头部字段
  const ifModifiedSince = ctx.request.get('If-Modified-Since');
  if (ifModifiedSince && new Date(ifModifiedSince) >= user.lastModified) {
    ctx.status = 304; // 返回304 Not Modified响应
    return;
  }
 
  // 返回资源内容
  ctx.body = user;
});

这样,服务器可以根据ETag和Last-Modified来进行缓存控制,提供更高效的资源传输和减少网络流量。