当同时使用 GraphQL 时,Nodejs 和 Express 在 MERN 堆栈 Web 应用程序中的作用是啥?

Posted

技术标签:

【中文标题】当同时使用 GraphQL 时,Nodejs 和 Express 在 MERN 堆栈 Web 应用程序中的作用是啥?【英文标题】:What is the role of Nodejs and Express in a MERN stack web application when GraphQL is also used?当同时使用 GraphQL 时,Nodejs 和 Express 在 MERN 堆栈 Web 应用程序中的作用是什么? 【发布时间】:2020-03-28 19:55:24 【问题描述】:

我知道这是一个非常初学者的问题,但是当涉及到 MERN 堆栈和 GraphQL 时,我很难掌握一些东西。有这个particular project on github 使用 MongoDB、Express、React 和 Nodejs 以及 GraphQL 开发 Web 应用程序。

我确实了解 MongoDB 用于数据存储,React 用于前端,但如果 API 是使用 GraphQL 创建的,它直接 POST 和 GETs 数据到,我无法理解为什么要使用 Express 和 Nodejs /来自 MongoDB 数据库? nodejs、express和graphql的作用和相互关系是什么?

这个问题对你来说可能没有意义,因为我缺少 Web 应用开发的基本概念知识和对 MERN 等 Web 开发堆栈的理解。

【问题讨论】:

【参考方案1】:

Node.js 是一个 javascript 运行时环境——它实际执行所有服务器端代码。 Express 是一个框架,它提供了在 Node.js 中开发 Web 应用程序的基本功能。虽然 Node.js 已经能够监听端口上的请求,但 Express 通过消除样板文件并提供更简单的 API 来创建端点,让设置 Web 服务器变得更简单。

GraphQL 是一种查询语言。 GraphQL.js 是 GraphQL 的 JavaScript 实现。两者都不能创建端点或 Web 服务器。 GraphQL 本身不会监听对特定端口的请求。这就是我们使用 Express 的目的——结合另一个库,如 apollo-server-expressexpress-graphql,Express 设置我们的端点,监听到端点的传入请求,解析它们并将它们交给 GraphQL 执行。然后它将执行结果发送回发出请求的客户端。

同样,GraphQL.js 不能直接与数据库交互。 GraphQL 只是执行您为响应请求而提供的代码。与数据库的实际交互通常通过驱动程序(如mongodb)或ORM(如mongoose)完成。

因此,客户端(如您的 React 应用程序)向您的 Express 应用程序发出请求,后者解析请求并将其交给 GraphQL,GraphQL 执行您的查询并在此过程中调用一些代码,然后从您的数据库中获取数据。该数据被格式化为适当的响应并发送回客户端。

【讨论】:

【参考方案2】:

对于初学者,您所引用的缺失项目详细信息如下:

    使用Node.js 为API 生成或运行代码创建环境。 GraphQL 无法单独做到这一点。 Express 用于正文解析中间件,身份验证中间件(它将对每个 GraphQL 请求进行身份验证)和express-graphql 用于 GraphQL 与 express 框架的集成(意味着在身份验证中间件 next() 函数触发后将调用 graphQL API 函数)。 GraphQL 创建 API,需要经过 auth 中间件调用 next() 函数。

所以项目的工作方式如下:

    Mongoose 先连接。 Node.js 启动服务器。 当 API 调用发送到服务器时,那么 a) 使用 express bodyParser 解析它们 b) 在这些请求上设置标头。 c) auth 中间件调用。 d) 现在是 GraphQL 的工作来处理 API。

【讨论】:

以上是关于当同时使用 GraphQL 时,Nodejs 和 Express 在 MERN 堆栈 Web 应用程序中的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 nodejs 对 graphql 使用啥

使用 NodeJS 发送基于 DynamoDb 流的 graphQL 突变

使用 graphql 和 nodejs 填充猫鼬模式

每次更改多次触发 GraphQl 订阅解析器

GraphQL 订阅、websocket、nodejs、Express 会话

GraphQL 不允许在 NodeJS 中插入数组对象