Nodejs、GraphQL、MongoDB、Hapi 和 Swagger 构建 API(二)

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 笔记

4.png可重用 API 流行的最大原因是 API 允许使用来自 Web 客户端、移动应用程序、桌面应用程序的数据,实际上是任何客户端。将构建一个基于 Nodejs,由 MongoDB 数据驱动的强大而灵活的 GraphQL API,并支持 Swagger 文档。

本文基于《Nodejs、GraphQL、MongoDB、Hapi 和 Swagger 构建 API(一)》的MongoDB数据库部分。

项目代码仓库:github.com/QuintionTan…


路由设置


Hapi 的路由非常直观,假设点击 / 希望发生什么?这里有三个主要组成部分。

  • path:一般是资源的路径
  • method:API请求方法,一般是指HTTP方法,常用的包括 POSTGETPUTDELETE
  • handler:一般是指API的响应逻辑


const hapi = require("hapi");
const server = hapi.server({
    port: 3006,
    host: "localhost",
});
const init = async () => {
    server.route({
        method: "GET",
        path: "/",
        handler: (request, response) => `<h1>This is powerful api.</h1>`,
    });
    await server.start();
    console.log(`Server running at:${server.info.uri}`);
};
init();

init 方法中,使用 serverroute 的方法增加根目录访问的响应API,一个简单的 GET 接口。

5.png

设置数据库


接下来要建立数据库,这里将使用 mongodbmongoose

本文构建的API服务使用一个基于分布式文件存储的数据库 MongoDB。

在 Nodejs 中编写与数据库相关的逻辑(CURD操作)通常使用 Mongoose ,而  Mongoose 是 MongoDB 的一个对象模型工具,是基于 node-mongoldb-native 开发的 MongoDB 驱动,可以在异步环境下执行。同时它也是针对 MongoDB 操作的一个对象模型库,封装了MongoDB对文档的的一些增删改查等常用方法,让 Nodejs 下操作 MongoDB 数据库变得更加灵活简单。

在 Nodejs 下 MongoDB + Mongoose 是一种常见的开发组合。

开始安装依赖:


npm install mongoose --save

在文件 server.js 引入:

const mongoose = require("mongoose");

接下来先来配置数据库环境,可以参考官方文档进行安装,按照文档步骤基本可以正常配置好,这里就不展开。这里介绍使用 Docker 来启动一个 MongoDB,对于 Docker 如果不熟悉,可以参阅《面向WEB开发人员的Docker》。

设置 Mongo Docker 镜像

使用以下命令拉取 Docker 镜像:


docker pull mongo

6.png

现在已经将Mongo Docker 镜像下载到自己机器上了,执行以下命令运行 MongoDB 。


docker run -it -v $PWD/mongodata:/data/db -p 27017:27017 --name mongodb -d mongo

MongoDB 运行在端口 27017 上,数据存储在项目根目录下的文件夹 mongodata

接下来增加数据库连接逻辑:

const mongoUrl = "mongodb://127.0.0.1:27017/powerful";
const mainDB = mongoose
    .createConnection(mongoUrl, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
    })
    .asPromise();
mainDB
    .then((db) => {
        console.info("Connected to MongoDB mainDB");
        db.model("Users", new mongoose.Schema({ name: String }));
    })
    .catch((err) => {
        console.error("Failed to connect to mainDB", {
            params: { err: err.message },
        });
    });

在终端运行代码可以看到如下结果:

7.png

到这里就完成数据库的设置和连接,连接成功后创建一个 Users 的集合,可以通过 MongoDB 可视化工具 MongoDB Compass 连接到数据库查看数据信息:

8.png

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
前端开发 NoSQL MongoDB
一款基于Nodejs+express+mongodb的内容管理系统
一款基于Nodejs+express+mongodb的内容管理系统
118 0
|
NoSQL JavaScript MongoDB
阿里云服务器部署个人网站(nodejs + mongodb)
阿里云服务器部署个人网站(nodejs + mongodb)
231 0
|
存储 NoSQL JavaScript
|
存储 NoSQL JavaScript
Nodejs下使用MongoDB
nodejs作为一门非常火爆的技术栈,可以做很多事情,那么nodejs和MongoDB碰撞在一起又会产生怎么样的火花呢?接下来我们就来了解一下,在Nodejs下使用MongoDB。
|
SQL NoSQL 前端开发
前端培训-中级阶段(51)- nodeJS操作,MongoDB,文档CURD操作
前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。
135 0
前端培训-中级阶段(51)- nodeJS操作,MongoDB,文档CURD操作
|
NoSQL 关系型数据库 MySQL
【译】MongoDb vs Mysql—以NodeJs为例
【译】MongoDb vs Mysql—以NodeJs为例亲爱的读者,您可能想知道为什么要写关于MongoDb和MySql这篇文章。那是因为我与NodeJs开发人员讨论在应用程序中使用哪种数据存储作为主要的数据存储方式。
1840 0
|
弹性计算 JavaScript NoSQL
基于MongoDB与NodeJS构建物联网系统
目标 基于阿里云服务快速构建物联网系统 准备工作 ECS MongoDB EMR Alinode 中间件代码 注意事项:ECS,MongoDB 可以选择按量计费的服务。 实例申请 Step1 拿到阿里云账号,登陆 Step2 控制台新建实例 新建实例: https://mongodb.console.aliyun.com/#/buy/mongodb?chargeType=PostPaid 新建实例时,请选择『按量付费』类型,并需要选择合适的CPU 内存规格,磁盘空间、并设置 root 密码(后续连接实例需要用到)。
6168 0
|
JSON NoSQL JavaScript
NodeJs操作MongoDB之分页功能与常见问题
NodeJs操作MongoDB之分页功能与常见问题一,方法介绍 1,聚合操作之count count()方法可以查询统计符合条件的集合的总数 1 db.User.count() // 此方法等价于 db.User.find().count()在分布式集合中,会出现计算错误的情况,这个时候推荐使用aggregate; 2,find() 方法以非结构化的方式来显示所有文档。
1748 0