2.8 KiB
2.8 KiB
4.1-fasify+ts 项目
初始化
pnpm init
pnpm add -D typescript
# 生成一个 tsconfig.json 文件
npx tsc --init
tsconfig.json
需要进行一些调整
{
"compilerOptions": {
"target": "es2022", // 根据 Node.js 版本选择合适的 ECMAScript 目标版本
"module": "node16", // Node.js 使用 CommonJS
"lib": ["es2022"], // 包含的库文件
"outDir": "./dist", // 输出目录
"rootDir": "./src", // 源文件目录
"strict": true, // 启用所有严格类型检查选项
"esModuleInterop": true, // 允许默认导入非 ESModule 模块
"skipLibCheck": true, // 跳过所有声明文件的类型检查
"forceConsistentCasingInFileNames": true // 强制文件名大小写一致
},
"include": ["src/**/*"], // 包含的源文件
"exclude": ["node_modules", "dist"] // 排除的文件
}
pnpm add -D @types/node ts-node-dev tsconfig-paths
# tsconfig-paths 设置自定义路径
添加启动脚本 package.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node dist/index.js",
"dev": "NODE_ENV=dev nodemon --watch src -e ts --exec ts-node --esm src/index.ts",
"build": "tsc && tsc-alias"
},
创建目录和入口文件:
mkdir src
touch src/index.ts
编辑入口文件
// 导入 Fastify 和类型定义
import fastify, { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';
// 创建 Fastify 实例
const server: FastifyInstance = fastify({
logger: true
});
// 你好啊,世界
server.get('/', (request: FastifyRequest, reply: FastifyReply) => {
return 'hello world'
})
// 定义一个 GET 路由
server.get('/ping', async (request: FastifyRequest, reply: FastifyReply) => {
return 'pong\n';
});
// 带参数的路由 /greetings/xiaoming
server.get('/greetings/:name', async (request: FastifyRequest, reply: FastifyReply) => {
// 使用类型断言获取参数
const name = (request.params as any).name as string;
return `Hello, ${name}!\n`;
});
// 带查询字符串的路由 /echo?message=hello
server.get('/echo', async (request: FastifyRequest, reply: FastifyReply) => {
// 使用类型断言获取查询参数
const message = (request.query as any).message as string;
return `You said: ${message}\n`;
});
// 异步路由处理器
server.get('/async-operation', async (request: FastifyRequest, reply: FastifyReply) => {
const result = await someAsyncOperation();
return result;
});
// 监听端口
server.listen({ port: 3000 }, (err, address) => {
if (err) {
server.log.error(err);
process.exit(1);
}
server.log.info(`Server listening at ${address}`);
});
// 模拟的异步操作函数
async function someAsyncOperation(): Promise<string> {
return new Promise(resolve => setTimeout(() => resolve('Done!'), 1000));
}