State Management
Byte has built-in mechanism for creating and managing states during requests.
To attach a state to the ctx
object, call app.set
with the state name and a handler that returns the initial state value:
app.set('startTime', performance.now);
// Is the same asapp.prepare((ctx) => { ctx.startTime = performance.now();});
And use it in other middlewares or handlers (chaining is required):
app // Attach 'startTime' property to the context on every request .set('startTime', performance.now) // Example middleware .prepare(cors()) // Log the time it takes to run the CORS middleware .prepare((ctx) => { console.log(performance.now() - ctx.startTime); });
The handler passed in app.set
should be asynchronous if it returns a Promise
.
Because calling app.set
is the same as registering a middleware, the following example will not work:
app .prepare((ctx) => { // 'ctx.startTime' is undefined, so this logs NaN console.log(performance.now() - ctx.startTime); }) .set('startTime', performance.now);
Validation
You can validate the state value before attaching to ctx
using app.state
.
// My optimization trickconst noop = () => null;
app.state('message', async (ctx) => { const message = await ctx.req.text().catch(noop);
// Return an empty response with status 403 // if body parsing failed or message length is larger than 70 if (message === null || message.length > 70) { ctx.status = 403; return ctx.end(); }
// Attach to `ctx` to use later return message;});