hyperexpress框架/使用uwebsockets.js核心
import { scheduleJob } from 'node-schedule'; // 定时任务 function setupScheduledTasks() { // 每6秒执行一次 setInterval(() => { taskEverySixSeconds(); }, 6000); // 每33分钟执行一次 setInterval(() => { taskEveryThirtyThreeMinutes(); }, 33 * 60 * 1000); // 每天的1点到5点之间执行 scheduleJob('0 * 1-5 * * *', taskEarlyMorning); } // 示例任务函数 function taskEverySixSeconds() { console.log('Running task every 6 seconds'); } function taskEveryThirtyThreeMinutes() { console.log('Running task every 33 minutes'); } function taskEarlyMorning() { console.log('Running early morning task'); } // 在main函数中调用 setupScheduledTasks();
app.all('/*', (req, res) => { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); if (req.method === 'OPTIONS') { res.status(204).end(); } else { res.next(); } });
import { verifyToken } from './auth'; // 假设你有一个auth模块来处理token验证 app.use(json(), (req, res, next) => { const token = req.header('Authorization')?.replace('Bearer ', ''); if (token) { try { const userInfo = verifyToken(token); // verifyToken应该返回用户信息或抛出错误 req.userInfo = userInfo; // 将用户信息写入请求对象 next(); } catch (error) { res.status(401).json({ error: 'Invalid token' }); } } else { res.status(401).json({ error: 'No token provided' }); } });
npm install node-schedule
npm install cors
在这个示例中,我使用了cors
中间件来处理跨域请求,而不是手动设置CORS头。这是一个更简洁的方法,因为它会自动处理预请求(preflight)和其他CORS相关的复杂性。
确保你已经定义了taskEverySixSeconds
,taskEveryThirtyThreeMinutes
,和taskEarlyMorning
函数,它们将包含你的业务逻辑。
同时,verifyToken
函数应该是你在一个单独的文件中定义的,比如auth.ts
,它接受一个token,验证它,并返回用户信息或抛出错误。这里的中间件会检查请求头中的Authorization
字段,并尝试解析和验证token。如果验证成功,用户信息将被附加到req.userInfo
。
import { serve } from 'hyperexpress'; import { connectToDatabase } from './db'; import { setupRoutes } from './routes'; import { json } from 'hyperexpress'; import { setInterval } from 'timers'; import schedule from 'node-schedule'; import cors from 'cors'; const app = serve(); // 跨域处理 app.use(cors({ origin: '*', // 或者配置具体的允许域名 methods: 'GET, POST, PUT, DELETE', allowedHeaders: 'Content-Type, Authorization' })); app.use(json()); // Token验证中间件 app.use((req, res, next) => { const token = req.headers.authorization?.split(' ')[1]; // 获取Bearer后面的Token if (token) { try { const userInfo = verifyToken(token); // 假设verifyToken是一个解析Token并返回用户信息的函数 req.userInfo = userInfo; // 将用户信息写入请求对象 next(); } catch (error) { res.status(401).json({ error: 'Invalid token' }); } } else { next(); // 如果没有Token,可以选择继续或者返回错误 } }); // 设置路由 setupRoutes(app); // 定时任务 function setupScheduledTasks() { // 每6秒执行一次 setInterval(() => { taskEverySixSeconds(); }, 6000); // 每33分钟执行一次 setInterval(() => { taskEveryThirtyThreeMinutes(); }, 33 * 60 * 1000); // 每天的1点到5点之间执行 const rule = new schedule.RecurrenceRule(); rule.hour = [1, 5]; // 每天的1点到5点 rule.minute = 0; // 每小时的开始 schedule.scheduleJob(rule, taskEarlyMorning); } // 示例任务函数 function taskEverySixSeconds() { console.log('Running task every 6 seconds'); // 你的业务逻辑 } function taskEveryThirtyThreeMinutes() { console.log('Running task every 33 minutes'); // 你的业务逻辑 } function taskEarlyMorning() { console.log('Running early morning task'); // 你的业务逻辑 } async function main() { await connectToDatabase(); setupScheduledTasks(); // 设置定时任务 await app.listen(3000); console.log('Server is running on port 3000'); } main();
npm install hyperexpress @deepkit/orm @deepkit/orm-postgres-driver pg // src/entity/User.ts import { Entity, PrimaryKey, Property } from '@deepkit/orm'; @Entity() export class User { @PrimaryKey() id: number; @Property() name: string; @Property() email: string; }
// src/db.ts import { DeepKitConnection } from '@deepkit/orm'; import { User } from './entity/User'; export const connection = new DeepKitConnection({ type: 'postgres', host: 'localhost', port: 5432, username: 'your_username', password: 'your_password', database: 'your_database', entities: [User], }); export async function connectToDatabase() { await connection.connect(); }
4. 创建服务
创建用户服务来处理业务逻辑:
// src/service/UserService.ts import { Repository } from '@deepkit/orm'; import { User } from '../entity/User'; export class UserService { userRepository: Repository<User>; constructor() { this.userRepository = connection.getRepository(User); } async createUser(userData: Partial<User>): Promise<User> { const user = this.userRepository.create(userData); await this.userRepository.persistAndFlush(user); return user; } async findAllUsers(): Promise<User[]> { return this.userRepository.find(); } async findUserById(id: number): Promise<User | null> { return this.userRepository.findOne({ id }); } async updateUser(id: number, updatedData: Partial<User>): Promise<User | null> { await this.userRepository.update(id, updatedData); return this.userRepository.findOne({ id }); } async deleteUser(id: number): Promise<void> { await this.userRepository.removeAndFlush({ id }); } }
// src/main.ts import { serve } from 'hyperexpress'; import { connectToDatabase } from './db'; import { setupRoutes } from './routes'; import { json } from 'hyperexpress'; const app = serve(); app.use(json()); // Set up routes setupRoutes(app); async function main() { await connectToDatabase(); await app.listen(3000); console.log('Server is running on port 3000'); } main();
// src/routes.ts import { app } from './app'; import { UserService } from './service/UserService'; import { json } from 'hyperexpress'; // Helper function to set up all routes export function setupRoutes(app: ReturnType<typeof serve>) { const userService = new UserService(); app.post('/users', async (req, res) => { try { const user = await userService.createUser(req.body); res.status(201).json(user); } catch (error) { res.status(500).json({ error: error.message }); } }); // ... Other route handlers // Add the rest of the route handlers here // ... app.get('/users', async (req, res) => { // ... Route handler implementation }); app.get('/users/:id', async (req, res) => { // ... Route handler implementation }); app.put('/users/:id', async (req, res) => { // ... Route handler implementation }); app.delete('/users/:id', async (req, res) => { // ... Route handler implementation }); }
// src/app.ts import { serve } from 'hyperexpress'; export const app = serve();
# 使用官方Node.js的基础镜像 FROM node:lts # 设置工作目录 WORKDIR /usr/src/app # 复制项目文件到工作目录 COPY package*.json ./ # 安装项目依赖 RUN npm install # 复制项目文件到工作目录 COPY . . # 暴露端口3000 EXPOSE 3000 # 启动应用程序 CMD [ "npm", "start" ]
# .dockerignore node_modules npm-debug.log "scripts": { "start": "node src/main.ts" } docker build -t my-hyperexpress-app . docker run -p 3000:3000 my-hyperexpress-app curl http://localhost:3000/users
npm install hyper-express mikro-orm npm install @mikro-orm/postgresql module.exports = { entities: ['dist/**/*.entity.js'], entitiesTs: ['src/**/*.entity.ts'], dbName: 'your_database_name', type: 'postgresql', host: 'localhost', port: 5432, user: 'your_database_user', password: 'your_database_password', debug: true, }; import { Entity, PrimaryKey, Property } from '@mikro-orm/core'; @Entity() export class Example { @PrimaryKey() id: number; @Property() title: string; @Property() content?: string; @Property() published: boolean; }
import { serve } from 'hyper-express'; import { MikroORM } from '@mikro-orm/core'; import { json } from 'body-parser'; import Example from './src/Example'; // Import your entity // Initialize MikroORM const orm = await MikroORM.init({ entities: [Example], // ... other MikroORM options }); const app = serve(); app.use(json()); // Create record app.post('/examples', async (req, res) => { const example = orm.em.create(Example, req.body); await orm.em.persistAndFlush(example); res.json(example); }); // Read records app.get('/examples', async (req, res) => { const examples = await orm.em.find(Example, {}); res.json(examples); }); // Read specific record app.get('/examples/:id', async (req, res) => { const example = await orm.em.findOne(Example, { id: parseInt(req.params.id) }); if (!example) { res.status(404).json({ message: 'Not found' }); } else { res.json(example); } }); // Update record app.put('/examples/:id', async (req, res) => { const example = await orm.em.findOne(Example, { id: parseInt(req.params.id) }); if (!example) { res.status(404).json({ message: 'Not found' }); return; } orm.em.assign(example, req.body); await orm.em.flush(); res.json(example); }); // Delete record app.delete('/examples/:id', async (req, res) => { const example = await orm.em.findOne(Example, { id: parseInt(req.params.id) }); if (!example) { res.status(404).json({ message: 'Not found' }); return; } await orm.em.removeAndFlush(example); res.json({ message: 'Deleted successfully' }); }); app.listen(3000, () => { console.log('Server started on http://localhost:3000'); });
const express = require('express'); const swaggerJsdoc = require('swagger-jsdoc'); const swaggerUi = require('swagger-ui-express'); // ... 其他导入和MikroORM初始化代码 // Swagger definition const swaggerOptions = { definition: { openapi: '3.0.0', info: { title: 'Example API', version: '1.0.0', description: 'Example API with Swagger', }, }, apis: ['index.js'], // Path to the API docs }; // Initialize Swagger const swaggerDocs = swaggerJsdoc(swaggerOptions); const app = express(); app.use(json()); // Serve Swagger UI app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocs)); // ... REST API routes // Swagger UI will be available at http://localhost:3000/api-docs app.listen(3000, () => { console.log('Server started on http://localhost:3000'); console.log('Swagger UI available at http://localhost:3000/api-docs'); });
/** * @swagger * /examples: * post: * description: Create a new example * requestBody: * required: true * content: * application/json: * schema: * type: object * required: * - title * properties: * title: * type: string * content: * type: string * published: * type: boolean * responses: * 201: * description: Example created successfully */ app.post('/examples', async (req, res) => { // ... 创建记录的代码 });
在 Node.js 项目中,dependencies 文件通常指的是项目的依赖列表,它会列出项目中所有需要用到的外部模块。这个依赖列表会被记录在项目根目录下的 package.json 文件中。 { "name": "my-nodejs-project", "version": "1.0.0", "description": "A sample Node.js project", "main": "app.js", "dependencies": { "express": "^4.17.1" } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix