GraphQL 是由 Facebook 开发的一种通过 API 来调用服务端数据的查询语言规范,近年来成为了前端开发中的热门技术之一。而 Deno 是由 Node.js 的创始人 Dennis M. Ritchie 开发的一个安全的 JavaScript/TypeScript 运行时环境。本文将介绍如何使用 Deno、GraphQL 和 MongoDB 来实现服务端开发,并提供详细的示例代码。
前置知识
在学习本文之前需要了解以下知识:
- 基本的 Node.js 或 JavaScript/TypeScript 开发经验
- GraphQL 的基本概念和使用方法
- MongoDB 数据库及基本操作
安装 Deno
可以通过以下命令在 Unix、Linux 和 macOS 系统上安装 Deno:
$ curl -fsSL https://deno.land/x/install/install.sh | sh
在 Windows 系统上可以通过 PowerShell 安装:
> iwr https://deno.land/x/install/install.ps1 -useb | iex
安装完毕后可以通过以下命令检查 Deno 是否安装成功:
$ deno --version
安装依赖
本文使用到的依赖有:
mongo
:用于操作 MongoDB 数据库oak
:用于搭建基于 HTTP 和 WebSocket 的应用程序graphql
:GraphQL 的 JavaScript 实现
使用以下命令安装:
$ deno install --allow-net --allow-read http://deno.land/x/oak/mod.ts $ deno install --allow-net --allow-read https://deno.land/x/deno_mongo/mod.ts $ deno install --allow-net --allow-read https://cdn.pika.dev/graphql/14.0.2
配置路由
首先需要在 app.ts
文件中配置路由,可以编写以下代码:
// javascriptcn.com 代码示例 import { Application, Router } from "oak"; const app = new Application(); const router = new Router(); // 定义路由 router .post("/graphql", async (context) => { // 处理 GraphQL 请求 }) .get("/", (context) => { context.response.body = "Hello world!"; }); app.use(router.routes()); app.use(router.allowedMethods()); await app.listen({ port: 8000 });
连接 MongoDB
在 app.ts
中可以编写以下代码来连接 MongoDB:
// javascriptcn.com 代码示例 import { MongoClient } from "mongodb"; // 连接数据库 const client = new MongoClient(); await client.connect("mongodb://localhost:27017"); // 选择数据库和集合 const database = client.database("mydatabase"); const collection = database.collection("mycollection");
处理 GraphQL 请求
使用 graphql
包可以轻松地处理 GraphQL 请求,可以编写以下代码:
// javascriptcn.com 代码示例 import { buildSchema, execute, GraphQLSchema, parse, validate, } from "graphql"; // 定义 GraphQL schema const schema: GraphQLSchema = buildSchema(` type Query { user(id: ID!): User! } type User { id: ID! name: String! email: String } `); // 处理 GraphQL 请求 router.post("/graphql", async (context) => { // 将请求数据解析为字符串 const body = new TextDecoder().decode(await context.request.arrayBuffer()); // 将请求数据解析为 GraphQL AST const document = parse(body); // 验证 GraphQL 请求是否符合 schema const validationErrors = validate(schema, document); if (validationErrors.length) { context.response.status = 400; context.response.body = { errors: validationErrors.map((error) => ({ message: error.message })), }; return; } // 执行 GraphQL 查询 const result = await execute(schema, document, null, context, null); // 返回查询结果 context.response.body = result; });
其中需要安装 TextDecoder
:
$ deno install --allow-env --allow-run --allow-net --allow-read --allow-write https://deno.land/std/node/text_decoder.ts
完整代码
以上是 Deno 中使用 GraphQL 和 MongoDB 实现服务端开发的主要代码,下面给出完整的 app.ts
代码:
// javascriptcn.com 代码示例 import { Application, Router } from "oak"; import { buildSchema, execute, GraphQLSchema, parse, validate, } from "graphql"; import { MongoClient } from "mongodb"; const app = new Application(); const router = new Router(); // 连接 MongoDB const client = new MongoClient(); await client.connect("mongodb://localhost:27017"); const database = client.database("mydatabase"); const collection = database.collection("mycollection"); // 定义 GraphQL schema const schema: GraphQLSchema = buildSchema(` type Query { user(id: ID!): User! } type User { id: ID! name: String! email: String } `); // 处理 GraphQL 请求 router.post("/graphql", async (context) => { // 将请求数据解析为字符串 const body = new TextDecoder().decode(await context.request.arrayBuffer()); // 将请求数据解析为 GraphQL AST const document = parse(body); // 验证 GraphQL 请求是否符合 schema const validationErrors = validate(schema, document); if (validationErrors.length) { context.response.status = 400; context.response.body = { errors: validationErrors.map((error) => ({ message: error.message })), }; return; } // 执行 GraphQL 查询 const result = await execute(schema, document, null, context, null); // 返回查询结果 context.response.body = result; }); app.use(router.routes()); app.use(router.allowedMethods()); await app.listen({ port: 8000 });
总结
本文介绍了如何在 Deno 中使用 GraphQL 和 MongoDB 实现服务端开发。首先需要安装 Deno 并安装相关依赖,之后可以配置路由、连接 MongoDB 和处理 GraphQL 请求。使用 Deno、GraphQL 和 MongoDB 可以轻松地实现服务端开发,具有很好的可扩展性和可维护性,希望本文可以对读者有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653721df7d4982a6ebf7e55c