在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:graphql/express-graphql开源软件地址:https://github.com/graphql/express-graphql开源编程语言:TypeScript 82.6%开源软件介绍:GraphQL HTTP Server MiddlewareCreate a GraphQL HTTP server with any HTTP web framework that supports connect styled middleware, including Connect itself, Express and Restify. Installationnpm install --save express-graphql TypeScriptThis module includes a TypeScript declaration file to enable auto complete in compatible editors and type information for TypeScript projects. Simple SetupJust mount const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const app = express();
app.use(
'/graphql',
graphqlHTTP({
schema: MyGraphQLSchema,
graphiql: true,
}),
);
app.listen(4000); Setup with RestifyUse const restify = require('restify');
const { graphqlHTTP } = require('express-graphql');
const app = restify.createServer();
app.post(
'/graphql',
graphqlHTTP({
schema: MyGraphQLSchema,
graphiql: false,
}),
);
app.get(
'/graphql',
graphqlHTTP({
schema: MyGraphQLSchema,
graphiql: true,
}),
);
app.listen(4000); Setup with Subscription Supportconst express = require('express');
const { graphqlHTTP } = require('express-graphql');
const typeDefs = require('./schema');
const resolvers = require('./resolvers');
const { makeExecutableSchema } = require('graphql-tools');
const schema = makeExecutableSchema({
typeDefs: typeDefs,
resolvers: resolvers,
});
const { execute, subscribe } = require('graphql');
const { createServer } = require('http');
const { SubscriptionServer } = require('subscriptions-transport-ws');
const PORT = 4000;
var app = express();
app.use(
'/graphql',
graphqlHTTP({
schema: schema,
graphiql: { subscriptionEndpoint: `ws://localhost:${PORT}/subscriptions` },
}),
);
const ws = createServer(app);
ws.listen(PORT, () => {
// Set up the WebSocket for handling GraphQL subscriptions.
new SubscriptionServer(
{
execute,
subscribe,
schema,
},
{
server: ws,
path: '/subscriptions',
},
);
}); OptionsThe
In addition to an object defining each option, options can also be provided as
a function (or async function) which returns this options object. This function
is provided the arguments The app.use(
'/graphql',
graphqlHTTP(async (request, response, graphQLParams) => ({
schema: MyGraphQLSchema,
rootValue: await someFunctionToGetRootValue(request),
graphiql: true,
})),
); HTTP UsageOnce installed at a path,
GraphQL will first look for each parameter in the query string of a URL:
If not found in the query string, it will look in the POST request body. If a previous middleware has already parsed the POST body, the If the POST body has not yet been parsed,
Combining with Other Express MiddlewareBy default, the express request is passed as the GraphQL This example uses const session = require('express-session');
const { graphqlHTTP } = require('express-graphql');
const app = express();
app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 } }));
app.use(
'/graphql',
graphqlHTTP({
schema: MySessionAwareGraphQLSchema,
graphiql: true,
}),
); Then in your type definitions, you can access the request via the third "context" argument in your new GraphQLObjectType({
name: 'MyType',
fields: {
myField: {
type: GraphQLString,
resolve(parentValue, args, request) {
// use `request.session` here
},
},
},
}); Providing ExtensionsThe GraphQL response allows for adding additional information in a response to
a GraphQL query via a field in the response called When called, this is provided an argument which you can use to get information about the GraphQL request:
This example illustrates adding the amount of time consumed by running the provided query, which could perhaps be used by your development tools. const { graphqlHTTP } = require('express-graphql');
const app = express();
const extensions = ({
document,
variables,
operationName,
result,
context,
}) => {
return {
runTime: Date.now() - context.startTime,
};
};
app.use(
'/graphql',
graphqlHTTP((request) => {
return {
schema: MyGraphQLSchema,
context: { startTime: Date.now() },
graphiql: true,
extensions,
};
}),
); When querying this endpoint, it would include this information in the result, for example: {
"data": { ... },
"extensions": {
"runTime": 135
}
} Additional Validation RulesGraphQL's validation phase checks the query to ensure that it can be successfully executed against the schema. The A validation rule is a function which returns a visitor for one or more node Types. Below is an example of a validation preventing the specific field name import { GraphQLError } from 'graphql';
export function DisallowMetadataQueries(context) {
return {
Field(node) {
const fieldName = node.name.value;
if (fieldName === 'metadata') {
context.reportError(
new GraphQLError(
`Validation: Requesting the field ${fieldName} is not allowed`,
),
);
}
},
};
} Disabling introspectionDisabling introspection does not reflect best practices and does not necessarily make your
application any more secure. Nevertheless, disabling introspection is possible by utilizing the
import { NoSchemaIntrospectionCustomRule } from 'graphql';
app.use(
'/graphql',
graphqlHTTP((request) => {
return {
schema: MyGraphQLSchema,
validationRules: [NoSchemaIntrospectionCustomRule],
};
}),
); Other Exports
Given an HTTP Request, this returns a Promise for the parameters relevant to running a GraphQL request. This function is used internally to handle the incoming request, you may use it directly for building other similar services. const { getGraphQLParams } = require('express-graphql');
getGraphQLParams(request).then((params) => {
// do something...
}); Debugging TipsDuring development, it's useful to get more information from errors, such as
stack traces. Providing a function to customFormatErrorFn: (error) => ({
message: error.message,
locations: error.locations,
stack: error.stack ? error.stack.split('\n') : [],
path: error.path,
}); Experimental featuresEach release of
Community feedback on this experimental release is much appreciated and can be provided on the PR for the defer-stream branch or the GraphQL.js issue for feedback. Contributing to this repoThis repository is managed by EasyCLA. Project participants must sign the free GraphQL Specification Membership agreement before making a contribution. You only need to do this one time, and it can be signed by individual contributors or their employers. To initiate the signature process please open a PR against this repo. The EasyCLA bot will block the merge if we still need a membership agreement from you. You can find detailed information here. If you have issues, please email [email protected]. If your company benefits from GraphQL and you would like to provide essential financial support for the systems and people that power our community, please also consider membership in the GraphQL Foundation. |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论