header

header

ctx对象的header属性是一个Map对象,可以修改该属性来设置响应头。

server.any("/test", (ctx) => {
	//设置响应头
	ctx.header.set("Content-Type", "text/html; charset=utf-8");
	//返回结果
	ctx.body = "<h1>你好</h1>";
});

vino当前没有单独的setCookie()方法,通常通过设置Set-Cookie响应头来完成。

server.get("/login", (ctx) => {
	// 设置一个名为 token 的 cookie
	ctx.header.set("Set-Cookie", "token=abc123; Path=/; HttpOnly; Max-Age=3600");
	ctx.body = {
		code: 0
	};
});

常见的 cookie 属性有:

  • Path=/ 表示整个站点路径都可以携带该 cookie。
  • HttpOnly 表示前端 JavaScript 不能直接读取该 cookie。
  • Max-Age=3600 表示 3600 秒后过期。
  • Secure 表示仅在 HTTPS 下发送。
  • SameSite=LaxSameSite=None 用于控制跨站请求时是否携带 cookie。

删除 cookie 不是删除响应头,而是再次返回一个同名的Set-Cookie,并将其设置为过期。

server.get("/logout", (ctx) => {
	// 删除 token cookie
	ctx.header.set("Set-Cookie", "token=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00 GMT");
	ctx.body = {
		code: 0
	};
});

删除时建议保持namePath与设置时一致,否则浏览器可能不会删除原来的 cookie。

ctx.header底层是Map,同一个 key 只能保留一个值。如果需要在一次响应里设置多个 cookie,不要连续调用:

ctx.header.set("Set-Cookie", "a=1; Path=/");
ctx.header.set("Set-Cookie", "b=2; Path=/");

上面的写法最终通常只会保留最后一个Set-Cookie

此时应使用responseWriteraddHeader()方法追加多个响应头:

server.get("/multi-cookie", (ctx) => {
	let writer = ctx.responseWriter();
	writer.addHeader("Set-Cookie", "a=1; Path=/; HttpOnly");
	writer.addHeader("Set-Cookie", "b=2; Path=/; HttpOnly");
	ctx.body = {
		code: 0
	};
});

如果只是调用ctx.header.delete("Set-Cookie"),只会移除当前响应中的这个头,不会删除浏览器里已经保存的 cookie。

如果不设置响应头的Content-Type属性,vino会根据ctx.body的数据类型自动设置,详细规则请参考body文档。

更新时间 3/18/2026, 7:21:33 PM