Nodejs + Nestjs 极速开发后端 API

本贴最后更新于 1421 天前,其中的信息可能已经水流花落

Nodejs + Nestjs 极速开发后端 API

作为一名 Java 后端程序员,一直想学习前端进行全栈开发,而前端的重中之重就是 Javascript,所以学习 NodeJs 是有必要的,毕竟 NodeJs 也是使用 Js 语法,而且后端语言的思想也比较熟悉,容易入门。由于是门外汉对 js 和 ts 根本不了解,只是凭借经验尝试,讲错的地方请大家指正。

NestJs

什么是 NestJs?

Nest(NestJS)是用于构建高效,可扩展的 Node.js 服务器端应用程序的框架。内置并完全支持 TypeScript(但仍使开发人员能够使用纯 JavaScript 进行编码)

NestJs 对于 Java 程序员来说简直不要太简单,其中的模块思想和 MVC 思想以及依赖注入的思想与 Spring 不谋而合。并且通过注解可以使 Spring 使用者感觉回家一样trollface

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

查看是否安装成功

image.png

快速启动

ps: 对于 js 项目复杂的项目结构无法 hold 住?没关系 nestjs 一键生成

nest new nest-blog-api

image.png

可以选择使用 npm 还是 yarn 进行安装,都可以

使用 vscode 打开 nest-blog-api 文件夹

image.png

项目目录就已经生成好了

启动一下项目

npm run start:dev

image.png

在浏览器输入 http://127.0.0.1:3000

image.png

项目结构

项目自动生成了 helloworld 的示例代码,我们来分析一下

image.png

main.ts 可以看出是启动的入口,监听了 3000 端口,而 app.contorller.ts,app.module.ts,app.service.ts 更是 java 程序员喜闻乐见的 mvc 结构

app.service.ts 写了一个类 AppService,里面有个 getHello 的方法,并且使用 @Injectable() 表示这个类是可以被注入的

image.png

app.controller.ts 中注入了 AppService 并且定义了一个 get 请求接口,返回 hellworld,看到了熟悉的注解,根本不需任何 nest 文档也能凭借 java 开发的经验读懂代码。

image.png

app.module.ts 定义了一个模块,模块是 nestjs 里面非常重要的一个概念,将不同业务分成不同模块,可以清楚的将代码分类,提高可读性,也便于管理

image.png

@Module 注解提供了 4 个属性来修饰这个模块,也就是定义这个模块的具体内容

imports 代表将其他引用进来

controllers 代表这个模块的控制器,也就是 API 接口

providers 代表注入的实例,可以在模块中共享

exports 表示其他模块引用自己时,提供给其他模块访问的实例

集成 swagger

npm install --save @nestjs/swagger swagger-ui-express

然后在 main.ts 中写上 swagger 的配置

image.png

在浏览器打开 http://127.0.0.1:3000/api-docs

image.png

集成 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 连接信息

image.png

定义好模型

用于数据库数据和对象 orm 映射

image.png

然后在 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

image.png

这样一个后端 API 服务就搭建完成了。

源码

源码

  • Nestjs
    2 引用
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...