2024 版:Node.js+Express+Koa2+Nest.js 开发服务端(高の青)

2024-07-29 09:59:02 浏览数 (1)

在现代的 web 开发中,Node.js 是一种非常流行的服务器端 JavaScript 环境。我们来编写一个大致的框架和一些关键代码片段,以帮助你了解如何使用 Node.js、Express、Koa2 和 Nest.js 开发服务端应用。

1. 环境搭建

首先,你需要安装 Node.js 和 npm(Node.js 的包管理器)。然后,你可以使用 npm 初始化一个新的项目并安装所需的依赖。

代码语言:txt复制
mkdir my-server-app
cd my-server-app
npm init -y
npm install express koa2 @nestjs/common

2. Express 应用

创建一个简单的 Express 应用。

app.js:

代码语言:txt复制
const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello Express!');
});

app.listen(port, () => {
  console.log(`Express app listening at http://localhost:${port}`);
});

3. Koa2 应用

创建一个 Koa2 应用,使用 async/await 处理异步操作。

koaApp.js:

代码语言:txt复制
const Koa = require('koa');
const app = new Koa();

app.use(async (ctx) => {
  ctx.body = 'Hello Koa2!';
});

app.listen(4000, () => {
  console.log('Koa2 app listening on port 4000');
});

4. Nest.js 应用

Nest.js 应用的创建稍微复杂一些,因为它是一个全功能的框架。

main.ts:

代码语言:txt复制
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(5000);
  console.log(`Nest app listening at http://localhost:5000`);
}
bootstrap();

app.module.ts:

代码语言:txt复制
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

app.controller.ts:

代码语言:txt复制
import { Controller, Get } from '@nestjs/common';

@Controller()
export class AppController {
  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello Nest.js!';
  }
}

5. 路由、中间件和数据库集成

在 Express 和 Koa2 中,你可以定义路由和中间件。在 Nest.js 中,你可以使用装饰器来定义路由和中间件。

expressRoute.js:

代码语言:txt复制
const express = require('express');
const router = express.Router();

router.get('/express', (req, res) => {
  res.send('Express route');
});

app.use('/', router);

koaMiddleware.js:

代码语言:txt复制
app.use(async (ctx, next) => {
  await next();
  ctx.body = 'Koa middleware';
});

nestController.ts:

代码语言:txt复制
@Controller('nest')
export class NestController {
  @Get()
  findAll() {
    return 'Nest route';
  }
}

6. 数据库集成

在 Nest.js 中,你可以使用 TypeORM 或 Mongoose 等 ORM 来集成数据库。

database.module.ts:

代码语言:txt复制
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [TypeOrmModule.forRoot(/* config */)],
  // ...
})
export class DatabaseModule {}

7. 错误处理和日志

在所有框架中,错误处理和日志记录都是重要的部分。

errorHandling.js (for Express and Koa2):

代码语言:txt复制
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

nestExceptionFilter.ts (for Nest.js):

代码语言:txt复制
import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common';

@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
  catch(exception: any, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const request = ctx.getRequest();
    
    response
      .status(500)
      .json({
        statusCode: 500,
        timestamp: new Date().toISOString(),
        path: request.url,
      });
  }
}

8. 测试

编写单元测试来确保你的代码按预期工作。

app.controller.spec.ts (for Nest.js):

代码语言:txt复制
import { Test, TestingModule } from '@nestjs/testing';
import { AppController } from './app.controller';
import { AppService } from './app.service';

describe('AppController', () => {
  let appController: AppController;
  let appService: AppService;

  beforeEach(async () => {
    const app: TestingModule = await Test.createTestingModule({
      controllers: [AppController],
      providers: [AppService],
    }).compile();

    appController = app.get<AppController>(AppController);
    appService = app.get<AppService>(AppService);
  });

  describe('root', () => {
    it('should return "Hello Nest.js!"', () => {
      jest.spyOn(appService, 'getHello').mockImplementation(() => 'Hello Nest.js!');
      expect(appController.getHello()).toBe('Hello Nest.js!');
    });
  });
});

0 人点赞