在现代的 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!');
});
});
});