Sometimes you may want to customize the behaviour of BlinkDB when methods like insert
, update
, remove
, or others are called.
Perhaps you want to prevent all calls to remove
(and instead soft delete records), or you’d like to log all actions taken, or
you just simply want to intercept all calls to a certain function.
This is all quite simple with a call to use()
:
use(userTable, async (ctx) => {
// Execute code before calling the implementation
console.log(ctx.action); // Log the method called
console.log(ctx.params); // Log parameters given to the method
// Call the native implementation
const result = await ctx.next(...ctx.params);
// Execute code after the implementation
console.log("Everything worked!");
// Don't forget to return the result ;)
return result;
})
More info about how hooks work can be found in the reference.
Hooks allow you to modify parameters passed to BlinkDB functions.
As an example, you can make sure that count
will always prefer performance to accuracy:
use(userTable, async (ctx) => {
if(isAction(ctx, "count")) {
// Always pass `{ exact: false }` as an option to `count`
return ctx.next(ctx.params[0], ctx.params[1], { exact: false });
}
return ctx.next(...ctx.params);
})
Just like you can change the objects you pass to ctx.next()
, you can also modify the return value:
use(userTable, async (ctx) => {
if(isAction(ctx, "count")) {
// `count(...)` will now always return 10 users more than we actually have
const num = await ctx.next(...ctx.params);
return num + 10;
}
return ctx.next(...ctx.params);
})