header
header
ctx对象的header属性是一个Map对象,可以修改该属性来设置响应头。
server.any("/test", (ctx) => {
//设置响应头
ctx.header.set("Content-Type", "text/html; charset=utf-8");
//返回结果
ctx.body = "<h1>你好</h1>";
});
设置 Cookie
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=Lax、SameSite=None用于控制跨站请求时是否携带 cookie。
删除 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
};
});
删除时建议保持name和Path与设置时一致,否则浏览器可能不会删除原来的 cookie。
多个 Cookie
ctx.header底层是Map,同一个 key 只能保留一个值。如果需要在一次响应里设置多个 cookie,不要连续调用:
ctx.header.set("Set-Cookie", "a=1; Path=/");
ctx.header.set("Set-Cookie", "b=2; Path=/");
上面的写法最终通常只会保留最后一个Set-Cookie。
此时应使用responseWriter的addHeader()方法追加多个响应头:
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文档。
