Nodejs + Nestjs 极速开发后端 API
作为一名 Java 后端程序员,一直想学习前端进行全栈开发,而前端的重中之重就是 Javascript,所以学习 NodeJs 是有必要的,毕竟 NodeJs 也是使用 Js 语法,而且后端语言的思想也比较熟悉,容易入门。由于是门外汉对 js 和 ts 根本不了解,只是凭借经验尝试,讲错的地方请大家指正。
NestJs
什么是 NestJs?
Nest(NestJS)是用于构建高效,可扩展的 Node.js 服务器端应用程序的框架。内置并完全支持 TypeScript(但仍使开发人员能够使用纯 JavaScript 进行编码)
NestJs 对于 Java 程序员来说简直不要太简单,其中的模块思想和 MVC 思想以及依赖注入的思想与 Spring 不谋而合。并且通过注解可以使 Spring 使用者感觉回家一样 。
TypeScript
在没有接触 TypeScript 之前,听到这个名字感觉恐怖如斯,js 都不太会用,ts 就出来了,太卷了太卷了 😳 ,在了解后才发现 ts 的出现大大的降低了后端程序员进入前端的门槛,众说周知 js 是一门没有静态类型检查的语言,也是动态类型的语言,这使得 js 难以构建大型的复杂系统,而 typescript 的出现改变了这一现状,typscript 是 javascript 的超集,在 javascript 的基础上增加了类型系统。使得一些在运行时出现的错误,被提前到编译期间产生,而且 typescript 能够提升了 IDE 的功能,包括代码补全、接口提示、跳转到定义、代码重构等,这在很大程度上提高了开发效率。而且 TypeScript 有近百个[编译选项][],如果你认为类型检查过于严格,那么可以通过修改编译选项来降低类型检查的标准。
所以不必深入研究 typeScript,仅仅凭借 Js 的知识和一些后端语言的 OOP 面向对象的思想就可以使用 Typescript 来进行开发。如果是后端的同学使用 typescript 的话更是事半功倍。
快速开始
本文既然是介绍 nestjs 作为服务端 API 接口开发,自然是会介绍使用方式。
所以 demo 会使用 nestjs 框架连接 mongodb 数据库来进行增删改查,并且集成 swagger 来生成接口文档。swagger 永远滴神
安装 nestjs
$ npm i -g @nestjs/cli
查看是否安装成功
快速启动
ps: 对于 js 项目复杂的项目结构无法 hold 住?没关系 nestjs 一键生成
nest new nest-blog-api
可以选择使用 npm 还是 yarn 进行安装,都可以
使用 vscode 打开 nest-blog-api 文件夹
项目目录就已经生成好了
启动一下项目
npm run start:dev
在浏览器输入 http://127.0.0.1:3000
项目结构
项目自动生成了 helloworld 的示例代码,我们来分析一下
main.ts
可以看出是启动的入口,监听了 3000 端口,而 app.contorller.ts
,app.module.ts
,app.service.ts
更是 java 程序员喜闻乐见的 mvc 结构
app.service.ts
写了一个类 AppService
,里面有个 getHello 的方法,并且使用 @Injectable()
表示这个类是可以被注入的
app.controller.ts
中注入了 AppService
并且定义了一个 get 请求接口,返回 hellworld,看到了熟悉的注解,根本不需任何 nest 文档也能凭借 java 开发的经验读懂代码。
app.module.ts
定义了一个模块,模块是 nestjs 里面非常重要的一个概念,将不同业务分成不同模块,可以清楚的将代码分类,提高可读性,也便于管理
@Module
注解提供了 4 个属性来修饰这个模块,也就是定义这个模块的具体内容
imports
代表将其他引用进来
controllers
代表这个模块的控制器,也就是 API 接口
providers
代表注入的实例,可以在模块中共享
exports
表示其他模块引用自己时,提供给其他模块访问的实例
集成 swagger
npm install --save @nestjs/swagger swagger-ui-express
然后在 main.ts
中写上 swagger 的配置
在浏览器打开 http://127.0.0.1:3000/api-docs
集成 mongodb
我们使用 mongodb 进行增删改查操作
yarn add mongoose nestjs-typegoose @typegoose/typegoose
安装完后我们先新建一个模块 posts
来写增删改查
nest create mo posts //新建posts模块
nest create co posts //新建controller
在 app.module.ts
中导入 post 模块和 mongo 连接信息
定义好模型
用于数据库数据和对象 orm 映射
然后在 app.controller.ts
中写好接口
import { Body, Controller, Delete, Get, Param, Post, Put } from '@nestjs/common';
import { ApiOperation, ApiProperty, ApiTags } from '@nestjs/swagger';
import { ModelType } from '@typegoose/typegoose/lib/types';
import { InjectModel } from 'nestjs-typegoose';
import {Post as PostSchema} from './post.model';
class CreatePostDTO {
@ApiProperty({
description:'标题'
})
title: string
@ApiProperty({
description:'正文',
})
content: string
}
@Controller('posts')
@ApiTags("帖子")
export class PostsController {
constructor(
@InjectModel(PostSchema) private readonly postModel:ModelType<PostSchema>
){}
@Get()
@ApiOperation({
summary:"帖子列表",
description:"获取帖子列表"
})
async index(){
return await this.postModel.find()
}
@Post()
@ApiOperation({
summary:"创建帖子",
description:"创建帖子"
})
async create(@Body() createPostDTO: CreatePostDTO){
await this.postModel.create(createPostDTO)
return {
success:true
}
}
@Get(':id')
@ApiOperation({
summary:"帖子详情",
description:"帖子详情"
})
async detail(@Param('id') id: string){
return await this.postModel.findById(id)
}
@Put(':id')
@ApiOperation({
summary:"编辑帖子",
description:"编辑帖子"
})
async update(@Param('id') id: string , @Body() updatePostDTO: CreatePostDTO){
await this.postModel.findByIdAndUpdate(id,updatePostDTO)
return {
success:true
}
}
@Delete(':id')
@ApiOperation({
summary:"删除帖子",
description:"删除帖子"
})
async remove(@Param('id') id: string){
await this.postModel.findByIdAndDelete(id)
return {
success:true
}
}
}
启动
npm run start:dev
这样一个后端 API 服务就搭建完成了。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于