在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来进行缓存控制,提供更高效的资源传输和减少网络流量。