Here's an example based on the code you shared which shows how to read and set a cookie (and also store data in the context's state) using Oak. You can simply copy + paste into a playground or project on Deno Deploy to try it:
import {
Application,
type Context,
type Middleware,
Router,
} from "https://deno.land/x/[email protected]/mod.ts";
// The shape of the state for this server app
// It can hold the last visited timestamp as a Date object
type State = {
lastVisit?: Date | undefined;
};
const cookieMiddleWare: Middleware<
State,
Context<State, State>
> = async (ctx, next) => {
// Get cookie value (if it exists)
const lastVisit = await ctx.cookies.get("last_visit");
// If it does, parse as a Date and set it to the context state
if (lastVisit) ctx.state.lastVisit = new Date(lastVisit);
// Update the cookie with the current timestamp
await ctx.cookies.set("last_visit", new Date().toISOString());
// Continue with next middleware
await next();
};
// Handle visits to the root path only
const router = new Router<State>()
.get("/", (ctx) => {
// If the last visit date is on the state, stringify it
// else set it to null
const lastVisit = ctx.state.lastVisit
? ctx.state.lastVisit.toISOString()
: null;
ctx.response.body = lastVisit
? `Welcome back. Your last visit was: ${lastVisit}`
: `Welcome. I haven't seen you before.`;
});
const app = new Application<State>()
.use(cookieMiddleWare)
.use(router.routes())
.use(router.allowedMethods());
app.addEventListener("listen", ({ hostname, port, secure }) => {
console.log(`Listening at http${secure ? "s" : ""}://${hostname}:${port}/`);
});
await app.listen({ port: 8080 });
ts app.use( oakCors({ origin: Deno.env.get('CORS_ORIGIN') || '*', allowedHeaders: ['Content-Type', 'Authorization', 'Accept'], }) )
Do you know why this doesn't work ? I've also tried setting sameSite to false in the cookie options and it still does not work. – Nananne