『埃尔法哥哥』nestjs使用Typeorm实现数据库CRUD操作( 二 )
})
exportclassAppModule{}
2.4main.ts入口文件
import{NestFactory}from'@nestjs/core';
import{AppModule}from'./app.module';
asyncfunctionbootstrap(){
constapp=awaitNestFactory.create(AppModule);//创建应用程序实例 , 此时所有被AppModule导入的其他模块的所有实例都会被加载
awaitapp.listen(3000);//使用3000端口监听应用程序
}
bootstrap();//启动应用程序->localhost:3000
2.5app.controller.spec.ts测试文件
修改了上述文件之后 , 命令行默认生成的测试文件也需要修改为异步的方式才能通过测试 。
import{Test,TestingModule}from'@nestjs/testing';
import{AppController}from'./app.controller';
import{AppService}from'./app.service';
describe('AppController',()=>{
letappController:AppController;
beforeEach(async()=>{
constapp:TestingModule=awaitTest.createTestingModule({
controllers:[AppController],
providers:[AppService],
}).compile();
appController=app.get(AppController);
});
describe('get',()=>{
it('shouldreturn"HelloWorld!"',async()=>{
constdata=https://pcff.toutiao.jxnews.com.cn/p/20200505/awaitappController.root();
expect(data).toBe('HelloWorld!');
});
});
});
3.通用错误处理和接口文件
在项目实践中 , 注入错误处理、接口等模块化文件需要重复使用 。 最好集中在公用模块中 。 在项目根目录下创建common文件夹 , 并新建错误处理和接口模块 。
文章图片
3.1common/errors.interceptor.ts错误处理文件
import{CallHandler,ExecutionContext,HttpException,Injectable,NestInterceptor}from'@nestjs/common';
import{Observable}from'rxjs';
import{catchError}from'rxjs/operators';
@Injectable()
exportclassErrorsInterceptorimplementsNestInterceptor{
intercept(context:ExecutionContext,next:CallHandler):Observable{
//异常拦截器 , 拦截每个请求中的异常 , 目的是将异常码和异常信息改写为{code:xxx,message:xxx}类型
returnnext.handle().pipe(catchError((error,caught):any=>{
if(errorinstanceofHttpException){
returnPromise.resolve({
code:error.getStatus(),
message:error.getResponse()
});
}
returnPromise.resolve({
code:500,
message:`出现了意外错误:${error.toString()}`
});
}));
}
}
3.2common/result.interface.ts接口文件
//定义通用的API接口返回数据类型
exportinterfaceResult{
code:number;
message:string;
data?:any;
}
4.创建数据库增删读写API文件
在根目录下新建cat文件夹 , 并依次创建下列文件 。
4.1cat.controller.ts
import{Body,Controller,Delete,Get,Inject,Param,Post,Put}from'@nestjs/common';
import{Result}from'common/result.interface';
import{Cat}from'./cat.entity';
import{CatService}from'./cat.service';
@Controller('cat')
exportclassCatController{
constructor(
@Inject(CatService)privatereadonlyCatService:CatService,
){}
@Post()
asynccreateCat(@Body()Cat:Cat):Promise{
awaitthis.CatService.createCat(Cat);
return{code:200,message:'创建成功'};
- 埃尔法哥哥万物互联的5G时代,将会给我们的生活带来哪些变化?
- 埃尔法哥哥我学python的一点感受
- 埃尔法哥哥使用哪种编程语言的开发人员最幸福?
- 埃尔法哥哥vue移动端开发时,客户端如何判断当前设备是Android还是IOS
- 埃尔法哥哥还可以做扫地机器人啊,自动驾驶不做了
- 埃尔法哥哥短期内难以找到替代华为海思的客户,寒武纪交出上交所答卷
- 埃尔法哥哥人工智能与人类的未来
- 爱搞事的瑞哥哥5G最具性价比手机,华为再次发力!荣耀X10成为标杆
- 牛牛侃天下嫂子卖掉嫁妆养他,结果养出位超级富豪,父亲去世后哥哥辍学打工
- 埃尔法哥哥Arvind Krishna全球首秀,IBM新CEO