10分钟上手nest.js+mongoDB

2024-04-04 13:04
文章标签 js 分钟 mongodb 上手 nest

本文主要是介绍10分钟上手nest.js+mongoDB,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

bilibili:淼学派对抖音:淼学派对知乎:编程淼小红书:淼学派对微信视频号:淼学派对

废话不多说!

直接忽略掉没有用的理论!

实战!走起!

1.安装nest.js脚手架

cnpm i -g @nestjs/cli

2.创建nest项目


nest new 项目名

3.安装mongoose

项目中我们会用到 Mongoose 来操作我们的数据库,Nest 官方为我们提供了一个 Mongoose 的封装,我们需要安装 mongoose@nestjs/mongoose


npm install mongoose @nestjs/mongoose --save

4.创建模块


nest g module user server

脚手架工具会自动在 src/server/user 文件夹下创建一个 user.module.ts,这是 Nest 的模块文件,Nest 用它来组织整个应用程序的结构。


// user.module.ts
import { Module } from '@nestjs/common';
@Module({})
export class UserModule {}

同时还会在根模块 app.module.ts 中引入 UserModule 这个模块,相当于一个树形结构,在根模块中引入了 User 模块。

执行上面的终端命令之后,app.module.ts 中的代码已经发生了变化,在文件顶部自动引入了 UserModule,同时也在 @Module 装饰器的 imports 中引入了 UserModule

// app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './server/user/user.module'; // 自动引入
@Module({imports: [UserModule], // 自动引入controllers: [AppController],providers: [AppService]
})
export class AppModule {}

5.创建控制器

nest g controller user server

Nest 中,controller 就类似前端的路由,负责处理客户端传入的请求服务端返回的响应

举个例子,我们如果要通过 http://localhost:3000/user/users 获取所有的用户信息,那么我们可以在 UserController 中创建一个 GET 方法,路径为 users 的路由,这个路由负责返回所有的用户信息。


// user.controller.ts
import { Controller, Get } from '@nestjs/common';
@Controller('user')
export class UserController {@Get('users')findAll(): string {return "All User's Info"; // [All User's Info] 暂时代替所有用户的信息}
}

这就是 controller 的作用,负责分发和处理请求响应

当然,也可以把 findAll 方法写成异步方法,像这样:


// user.controller.ts
import { Controller, Get } from '@nestjs/common';
@Controller('user')
export class UserController {@Get('users')async findAll(): Promise<any> {return await this.xxx.xxx(); // 一些异步操作}
}

6.创建 Provider


nest g service user server

provider 我们可以简单地从字面意思来理解,就是服务的提供者

怎么去理解这个服务提供者呢?

举个例子,我们的 controller 接收到了一个用户的查询请求,我们不能直接在 controller 中去查询数据库并返回,而是要将查询请求交给 provider 来处理,这里我们创建了一个 UserService,就是用来提供数据库操作服务的。


// user.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class UserService {}

当然,provider 不一定只能用来提供数据库的操作服务,还可以用来做一些用户校验,比如使用 JWT 对用户权限进行校验的策略,就可以写成一个策略类,放到 provider 中,为模块提供相应的服务。

controllerprovider 都创建完后,user.module.ts 文件中多了一些代码,变成了这样:

// user.module.ts
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
@Module({controllers: [UserController],providers: [UserService]
})
export class UserModule {}

7.连接数据库引入 根模块Mongoose

连接数据之前,我们要先在根模块,也就是 app.module.ts 中引入 Mongoose 的连接模块:


// app.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './server/user/user.module';
@Module({  imports: [MongooseModule.forRoot('mongodb://localhost:27017/Users'), UserModule],controllers: [AppController],providers: [AppService]
})
export class AppModule {}

如果这里运行后端文件是又可能会报错,如果报错就添加:


npm install @types/mongoose --dev

安装完之后服务就正常重启了。

8.引入 分模块Mongoose

这里我们先要创建一个数据表的格式,在 src/server/user 文件夹下创建一个 user.schema.ts 文件,定义一个数据表的格式:


// user.schema.ts
import { Schema } from 'mongoose';
export const userSchema = new Schema({_id: { type: String, required: true }, // 覆盖 Mongoose 生成的默认 _iduser_name: { type: String, required: true },password: { type: String, required: true }
});

然后将我们的 user.module.ts 文件修改成这样:


// user.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { UserController } from './user.controller';
import { userSchema } from './user.schema';
import { UserService } from './user.service';
@Module({imports: [MongooseModule.forFeature([{ name: 'Users', schema: userSchema }])],controllers: [UserController],providers: [UserService]
})
export class UserModule {}

9.CRUD

创建两个文件做数据类型的定义:

user.interface.ts


// user.interface.ts
import { Document } from 'mongoose';
export interface User extends Document {
//   readonly _id: string;readonly user_name: string;readonly password: string;
}

user.dto.ts


// user.dto.ts
export class CreateUserDTO {readonly user_name: string;readonly password: string;}  export class EditUserDTO {readonly user_name: string;readonly password: string;}

我们打开 user.service.ts 文件,为 UserService 类添加一个构造函数,让其在实例化的时候能够接收到数据库 Model,这样才能在类中的方法里操作数据库。


import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { CreateUserDTO, EditUserDTO } from './user.dto';
import { User } from './user.interface';
@Injectable()
export class UserService {constructor(@InjectModel('Users') private readonly userModel: Model<User>) { }// 查找所有用户async findAll(): Promise<User[]> {const users = await this.userModel.find();return users;}// 查找单个用户async findOne(user_name: string): Promise<User> {return await this.userModel.findOne({user_name});}// 添加单个用户async addOne(body: CreateUserDTO): Promise<void> {await this.userModel.create(body);}// 编辑单个用户async updateOne(user_name: string, newPassword: string): Promise<void> {await this.userModel.updateOne({user_name},{password: newPassword});}// 删除单个用户async deleteOne(user_name: string): Promise<void> {await this.userModel.deleteOne({user_name});}
}

因为 mongoose 操作数据库其实是异步的,所以这里我们使用 async 函数来处理异步的过程。

现在,我们可以到 user.controller.ts 中设置路由了,将客户端的请求进行处理,调用相应的服务实现相应的功能:

import {Controller,Body,// Delete,Get,Param,Post,Put
} from '@nestjs/common';
import { CreateUserDTO, EditUserDTO } from './user.dto';
import { User } from './user.interface';
import { UserService } from './user.service';
interface UserResponse<T = unknown> {//这是一个 TypeScript 接口定义,用于描述用户响应的数据结构。它包含一个泛型参数 T,默认值为 unknown,其中包含 code(响应码)、data(响应数据,可选)和 message(响应消息)三个属性。code: number;data?: T;message: string;
}
@Controller('user')
export class UserController {constructor(private readonly userService: UserService) { }// GET /user/users@Get('/users')async findAll(): Promise<UserResponse<User[]>> {return {code: 200,data: await this.userService.findAll(),message: '查询成功.'};}// GET /user/:_id@Post('/find_one')async findOne(@Body() userData: { user_name: string }): Promise<UserResponse> {await this.userService.findOne(userData.user_name); // 使用传入的 user_name 参数return {code: 200,data: await this.userService.findOne(userData.user_name),message: '查询成功.'};}// POST /user/user@Post('/user')async addOne(@Body() body: CreateUserDTO): Promise<UserResponse> {await this.userService.addOne(body);return {code: 200,message: '添加成功.'};}// PUT /user/:_id@Post('/upd')async updateOne(@Body() userData: { user_name: string, newPassword: string }): Promise<UserResponse> {await this.userService.updateOne(userData.user_name, userData.newPassword); // 使用传入的 user_name 参数return {code: 200,message: '修改成功.'};}// Post /user/deluser@Post('/deluser1')async deleteOne(@Body() userData: { user_name: string }): Promise<UserResponse> {await this.userService.deleteOne(userData.user_name); // 使用传入的 user_name 参数return {code: 200,message: '删除成功.'};}
}

好的,到这里我们的nest.js一个调用mongoose来操作mongoDB数据库的后端程序就已经写好了。

我们接下来用小程序端作为前端来调用后端,将整个完整的前后端+数据库程序跑起来!

10.前端部分

index.js

// pages/index1/index1.js
Page({/*** 页面的初始数据*/data: {},// 增加// 输入框1的输入事件(姓名)input1Change(e) {this.setData({inputValue1: e.detail.value,});},// 输入框2的输入事件(年龄)input2Change(e) {this.setData({inputValue2: e.detail.value,});},tijiao(){wx.request({url: 'http://localhost:3000/user/user',method:'POST',data:{user_name:this.data.inputValue1,password:this.data.inputValue2},})},// 删除input1Change_del(e){this.setData({inputValue_del: e.detail.value,});},shanchu() {wx.request({url: 'http://localhost:3000/user/deluser1',method: 'POST',data: {user_name: this.data.inputValue_del,},success: (res) => {// 处理成功的情况console.log(res.data); // 可以打印后端返回的数据},fail: (error) => {// 处理失败的情况console.error(error);}})
},// 修改input1Change_upd(e){this.setData({inputValue1_upda: e.detail.value,});},input2Change_upd(e){this.setData({inputValue2_upda: e.detail.value,});},xiugai(){wx.request({url: 'http://localhost:3000/user/upd',method:'POST',data:{// 名字user_name:this.data.inputValue1_upda,// 修改后的年龄newPassword:this.data.inputValue2_upda,},})},// 查询input1Change_find(e){this.setData({inputValue1_find: e.detail.value,});},find(){wx.request({url: 'http://localhost:3000/user/find_one',method: 'POST',data:{// 名字user_name:this.data.inputValue1_find,},success: function(res) {// 请求成功,处理从服务器返回的数据console.log('服务器返回的数据:', res.data);// 检查是否找到匹配的记录if (res.data && res.data.length > 0) {// 处理返回的记录数据const records = res.data;records.forEach(record => {console.log('记录:', record);// 在这里进行您的处理逻辑,例如显示在界面上});} else {console.log('未找到匹配的记录');// 在界面上显示相应的消息,告知用户未找到匹配的记录}},fail: function(error) {// 请求失败,处理错误console.error('请求失败:', error);// 在界面上显示错误信息,告知用户请求失败}});},find_all(){wx.request({url: 'http://localhost:3000/user/users',method: 'GET',success: function(res) {// 请求成功,处理从服务器返回的数据console.log('服务器返回的数据:', res.data);// 检查是否找到匹配的记录if (res.data && res.data.length > 0) {// 处理返回的记录数据const records = res.data;records.forEach(record => {console.log('记录:', record);// 在这里进行您的处理逻辑,例如显示在界面上});} },fail: function(error) {// 请求失败,处理错误console.error('请求失败:', error);// 在界面上显示错误信息,告知用户请求失败}});}
})

这篇关于10分钟上手nest.js+mongoDB的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/875847

相关文章

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点: