Nodejs + Nestjs 极速开发后端 API

Gakkiyomi 是爆炸的烟火 本文由博客端 https://fangcong.ink 主动推送

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
    1 引用
  • Node.js

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

    131 引用 • 258 回帖 • 548 关注

广告 我要投放

欢迎来到这里!

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

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