Building Context
In GraphQL, context
is a value that is provided to every resolver and holds important contextual information that we can access in resolvers. (See Root fields & resolvers)
Benzene allows us to write a factory function that creates the context object in question. This context factory function will be used by downstream packages @benzene/http
and @benzene/ws
.
Writing the context factory function
The context factory function can be defined in contextFn
when instantiating the Benzene instance.
const GQL = new Benzene({
contextFn: ({ extra }) => {
return { role: "admin" };
},
});
It will receive an object with extra
, which is the second argument passed into the handler function of downstream packages. For example:
import { Benzene, makeHandler } from "@benzene/ws";
const GQL = new Benzene({
contextFn: ({ extra }) => {
// extra is { user: "Niko", ip: "127.0.0.1" }
return { user: extra.user };
},
});
const graphqlWS = makeHandler(GQL);
function onConnection(socket, req) {
const extra = {
user: "Niko",
ip: req.socket.remoteAddress,
};
graphqlWS(socket, extra);
}
Access the context in resolvers
This context will be created using the factory function on every request. We can access it in resolvers like so:
const resolvers = {
Query: {
catSecretPlan(obj, args, context, info) {
if (context.user !== "Niko")
throw new HttpError(401, "Only Niko can access this data");
return thePlan;
},
},
};