订阅入门
本指南介绍如何在 GraphQL 服务器上开始使用订阅功能。
如果您使用 Apollo Studio,请确保在连接设置中选择 graphql-ws 实现。 |
启用订阅功能
在 GraphQL 服务器上使用订阅之前,必须通过将 subscriptions
功能传递给 Neo4jGraphQL
来启用它们。
new Neo4jGraphQL({
typeDefs,
driver,
features: {
subscriptions: true
},
});
安装依赖项
然后,下一步是安装以下依赖项
npm i --save ws graphql-ws neo4j-driver @neo4j/graphql express @apollo/server body-parser cors
设置 @apollo/server
服务器
将以下代码添加到您的 index.js
文件中,以使用订阅实现一个简单的 @apollo/server
服务器(有关更多选项,请参阅 Apollo 文档)
import { ApolloServer } from "@apollo/server";
import { expressMiddleware } from "@apollo/server/express4";
import { ApolloServerPluginDrainHttpServer } from "@apollo/server/plugin/drainHttpServer";
import bodyParser from 'body-parser';
import cors from "cors";
import { createServer } from "http";
import neo4j from 'neo4j-driver';
import { Neo4jGraphQL } from '@neo4j/graphql';
import { WebSocketServer } from "ws";
import { useServer } from "graphql-ws/lib/use/ws";
import express from 'express';
const typeDefs = `
type Movie {
title: String
}
type Actor {
name: String
}
`;
const driver = neo4j.driver("bolt://localhost:7687", neo4j.auth.basic("username", "password"));
const neoSchema = new Neo4jGraphQL({
typeDefs,
driver,
features: {
subscriptions: true
},
});
async function main() {
// Apollo server setup with WebSockets
const app = express();
const httpServer = createServer(app);
const wsServer = new WebSocketServer({
server: httpServer,
path: "/graphql",
});
// Neo4j schema
const schema = await neoSchema.getSchema();
const serverCleanup = useServer(
{
schema,
context: (ctx) => {
return ctx;
},
},
wsServer
);
const server = new ApolloServer({
schema,
plugins: [
ApolloServerPluginDrainHttpServer({
httpServer
}),
{
async serverWillStart() {
return Promise.resolve({
async drainServer() {
await serverCleanup.dispose();
},
});
},
},
],
});
await server.start();
app.use(
"/graphql",
cors(),
bodyParser.json(),
expressMiddleware(server, {
context: async ({ req }) => ({ req }),
})
);
const PORT = 4000;
httpServer.listen(PORT, () => {
console.log(`Server is now running on http://localhost:${PORT}/graphql`);
});
}
main();
此设置使用默认的订阅机制,仅适用于开发、测试和单实例服务器。如果您需要为生产就绪的应用程序进行水平扩展,请参阅 水平扩展。 |
GraphQL 订阅
运行完之前的服务器后,可用的订阅将设置为 Movie
和 Actor
。您可以使用以下语句订阅新创建的电影
subscription {
movieCreated(where: { title: "The Matrix" }) {
createdMovie {
title
}
}
}
这样,任何使用匹配标题创建的新电影都将触发订阅。您可以使用以下查询尝试此操作
mutation {
createMovies(input: [{ title: "The Matrix" }]) {
movies {
title
}
}
}
进一步阅读
继续阅读有关 订阅 的本节,以获取更多信息和高级示例。