node中怎么使用nest.js 连接 mongodb 数据库?下面本篇文章给大家介绍一下node 框架 nest.js 使用 mongodb 的方法,希望对大家有所帮助!
在学习 nest 与数据库进行连接时,难免会遇到选择数据库的问题,这里作者选择的是 mongodb 记录一下简单使用。 大家可以根据不同需求选择合适的数据库。
贴出跟进看的文档以方便大家进一步学习 nest 中文文档 ,mongodb菜鸟教程
数据库简介mongodb 是一个基于分布式文件存储的数据库。由 c++ 语言编写。旨在为 web 应用提供可扩展的高性能数据存储解决方案。
mongodb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
数据库选择目前市面上有很多成熟的数据库可供大家选择。
据翻看各种资料作者这里得出的结论为大项目用 postgresql 小项目用 mongodb 所以作者准备一起学习下,这次因为想做一个小项目练练手所以先用 mongodb 看看怎么样。大家有不同看法欢迎在评论区讨论。配置基本服务确保电脑已经安装了 mongodb 没
记得弄完做一下环境配置,可以开机自启, 也可以选择自己启动哈hhh看个人
mongoose简单介绍一下 , mongoose 是一个操作 mongodb 的 nodejs 驱动库
mongodb 是数据库,nodejs 是js的一个运行环境,nodejs 不直接操作 mongodb,这个时候就需要相应的驱动程序来提供接口。
在 nest 项目中安装一下依赖项,两种安装方式,自行选择
$ npm install --save @nestjs/mongoose mongoose // npm 安装 $ yarn add @nestjs/mongoose mongoose // yarn 安装复制代码
安装完成后我们在 appmodule 文件中引入一下
/* app.module.ts */import { module } from '@nestjs/common';import { appcontroller } from './app.controller';import { appservice } from './app.service';// 我自己准备的 user 模块import { usermodule } from './user/user.module';// 引入 mongoose import { mongoosemodule } from '@nestjs/mongoose';@module({ // 用 forroot 方法连接数据库 imports: [usermodule, mongoosemodule.forroot('mongodb://localhost/test')], controllers: [appcontroller], providers: [appservice],})export class appmodule {}
基础功能模块这里用一个 user 模块来做 demo
这里我理解的基础功能模块包括 module(模块) controller(控制器) service(提供者) schema(数据模型) 我们主要是用 nest对 mongodb 做增删改查 这几个模块目前暂时够用。
对这几个模块做一些简单介绍:
由于我们上面已经对 app.module.ts 该根模块已经引入过了 mongoose 所以下面我们之间看一下功能模块是怎样的
schema在mongoose中,一切都源于 scheme,每个 schema 都会映射到 mongodb 的一个集合,并定义集合内文档的结构。schema 被用来定义模型,而模型负责从底层创建和读取 mongodb 的文档。
schema 可以用 nestjs 内置的装饰器来创建,或者也可以自己动手使用 mongoose的常规方式。使用装饰器来创建 schema 会极大大减少引用并且提高代码的可读性。这里作者用的是官方推荐方式用装饰器来创建,毕竟用的是 nest 不得用点特色的hhh。
/* user.schema.ts */ import { prop, schema, schemafactory } from '@nestjs/mongoose'; // @prop 装饰器接受一个可选的参数,通过这个,你可以指示这个属性是否是必须的,是否需要默认值,或者是标记它作为一个常量,下面是例子 // schemafactory 是 mongoose 内置的一个方法做用是读取模式文档 并创建 schema 对象 import { document } from 'mongoose'; export type userdocument = user & document; @schema() export class user extends document { @prop() name: string; // 设置值为必填 @prop({ required: true }) age: number; @prop() height: number; } export const userschema = schemafactory.createforclass(user);
等下和其他功能一起在 module 中引入。
service控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作。
/* user.service.ts */ import { model } from 'mongoose'; import { injectmodel } from '@nestjs/mongoose'; import { user, userdocument } from 'src/schema/user.schema'; import { createuserdto } from './user.dto'; @injectable() export class userservice { // 注册schema后,可以使用 @injectmodel() 装饰器将 user 模型注入到 userservice 中: constructor(@injectmodel('user') private usertest: model<userdocument>) {} // 添加 async create(createuserdto: createuserdto): promise<user> { const createuser = new this.usertest(createuserdto); const temp = await createuser.save(); return temp; } // 查找 async findall(): promise<user[]> { // 这里是异步的 const temp = await this.usertest.find().exec(); return temp; } // 查找 async findone(name: string): promise<user[]> { // 这里是异步的 const temp = await this.usertest.find({ name }); return temp; } // 删除 async delete(sid: number) { // 这里是异步的 remove 方法删除成功并返回相应的个数 const temp = await this.usertest.remove({ _id: sid }); return temp; } // 修改 async updateuser(sid: string, data: any) { // 这里是异步的 remove 方法删除成功并返回相应的个数 const temp = await this.usertest.updateone({ _id: sid }, { $set: data }); return temp; } }
等下和其他功能一起在 module 中引入。
controller控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作。
/* user.controller.ts */ // 引入 nest.js 内置的各个功能 import { body, controller, delete, get, param, post, put, query } from '@nestjs/common'; // 引入用户服务 import { userservice } from './user.service'; // 引入创建用户 dto 用于限制从接口处传来的参数 import { createuserdto } from './user.dto'; // 配置局部路由 @controller('user') export class usercontroller { constructor(private readonly userservice: userservice) {} // 创建user路由 user/createuser @post('createuser') async createuser(@body() body: createuserdto) { return this.userservice.create(body); } //查找所有 user 路由 @get('findall') async findall() { return this.userservice.findall(); } // 查找某一个用户路由 @get('findone') async findone(@query() query: any) { return this.userservice.findone(query.name); } // 删除一个用户的路由 @delete(':sid') deleteuser(@param() param: any) { return this.userservice.delete(param.sid); } // 更改用户信息的路由 @put(':sid') updateuser(@body() body: any, @param() param: any) { return this.userservice.updateuser(param.sid, body); } }
moudle模块是具有 @module() 装饰器的类。 @module() 装饰器提供了元数据,nest 用它来组织应用程序结构。
我们把以上内容引入到我们的 user 模块中
/* user.module.ts */ import { module } from '@nestjs/common'; import { usercontroller } from './user.controller'; import { userservice } from './user.service'; import { mongoosemodule } from '@nestjs/mongoose'; import { userschema } from 'src/schema/user.schema'; @module({ // mongoosemodule提供了forfeature()方法来配置模块,包括定义哪些模型应该注册在当前范围中。 // 如果你还想在另外的模块中使用这个模型,将mongoosemodule添加到catsmodule的exports部分并在其他模块中导入catsmodule。 // 这里的 name:'user' 为数据库表名称与 service 中注入的表名称对应两者不一样会报错 imports: [mongoosemodule.forfeature([{ name: 'user', schema: userschema }])], controllers: [usercontroller], providers: [userservice], }) export class usermodule {}
以上我们的基础布局完成,可以进行接口检验了接口检验处理这些配置我们还在 main.ts 文件中配置了全局路由 app.setglobalprefix('api'); 意思就是所有请求前面会有一个 /api/这里我们用的 postman 和 mongodb compass 官方推荐的可视化工具查看效果post 增这里我使用 post 请求,路由为/api/user/createuser 因为要限制请求参数的数据类型所以这里方式为 application/json
因为这里我们之前定义的 user 数据模型为 name,age,height, 所以请求里面只需要这几个参数即可,别的就算写进去也添加不到集合中
postman
打开 mongodb compass 查看数据
可以看到我们已经添加到数据库中一条数据,接下来我们在添加两条,方便等会的查询/删除/更改操作
get 查所有这里我使用 get 请求,,路由为/api/user/findall 因为这里是查 user 集合内所有数据,所以不用添加请求参数
postman
打开 mongodb compass 查看数据
可以看到我们已经查询到数据库中刚才在 user 集合中添加的三条数据切记要点 refresh 建不然软件不会自己刷新
get 查单个用户这里我使用 get 请求,路由为/api/user/findone 因为这里是查 user 集合内对应搜索条件的数据集合,这里我们用的是name 去查询的。也可以用唯一值 id 去查询。
postman
可以看到返回结果是一个集合,了解更多查询方式可以看下官网
put 改这里我使用 put 请求,路由为/api/user/:sid 因为要限制请求参数的数据类型所以这里方式为 application/json
因为这里我们之前定义的 user 数据模型为 age,height, 所以请求里面只需要这几个参数即可,别的就算写进去也添加不到集合中,我们这里传入数据库中小明的_id 61eea1b4144ea374a5b8455a 传入 param 中 ,然后把要修改的内容放入 body 中
postman
打开 mongodb compass 查看数据
可以看到我们已经把小明的年龄与身高做了修改
delete 删这里我使用 delete 请求,路由为/api/user/:sid 因为要限制请求参数的数据类型所以这里方式为 application/json
我们这里传入数据库中小明的_id 61eea1b4144ea374a5b8455a 传入 param 中 ,并发起请求
postman
打开 mongodb compass 查看数据
可以看到小明的信息已经不存在了
总结至此我们已经完成在 nest.js 中使用 mongoose 对 mongodb 数据的基础操作。并完成了在 nest 中使用装饰器来创建 数据模型 schema 。看文档好像还可以使用 nest 中内置的typeorm 来创建模型感兴趣的小伙伴可以去看一下。回头我学习其他数据库连接时在去翻阅看看怎么操作下。nest 要学的还有很多,管道,中间件,拦截器,路由守卫等,这些我是准备在写小 demo 中去使用来加深个人理解,不然只是单纯的看文档,难以理解,这里就先不赘述了~ 目前我知道的就是用管道做请求类型判断是很香的hhh感兴趣的小伙伴可以去了解下类验证器更多node相关知识,请访问:nodejs 教程!
以上就是聊聊node中怎么使用nest.js 连接 mongodb 数据库的详细内容。