首页 > 其他分享 >uWebSockets.js 框架经验

uWebSockets.js 框架经验

时间:2024-01-19 21:11:38浏览次数:25  
标签:const 框架 res app req ts uWebSockets js import

目录结构

project/
│
├── src/
│      ├── app.ts
│      ├── routes/
│      │      ├── userRoutes.ts
│      │      └── index.ts
│      ├── entities/
│      │      └── User.ts
│      ├── utils/
│      │      └── parseQuery.ts
│      └── index.ts
│
├── ormconfig.json
└── package.json

User 实体 (User.ts)

//  src/entities/User.ts

import  {  Entity,  PrimaryGeneratedColumn,  Column  }  from  'typeorm';

@Entity()
export  class  User  {
      @PrimaryGeneratedColumn()
      id:  number;

      @Column()
      name:  string;

      @Column()
      email:  string;
}

ORM 配置 (ormconfig.json)

//  ormconfig.json

{
      "type":  "postgres",
      "host":  "localhost",
      "port":  5432,
      "username":  "postgres",
      "password":  "password",
      "database":  "test",
      "entities":  ["src/entities/*.ts"],
      "synchronize":  true
}

请求参数解析函数 (parseQuery.ts)

//  src/utils/parseQuery.ts

export  const  parseQuery  =  (req:  any):  Promise<any>  =>  {
      return  new  Promise((resolve,  reject)  =>  {
          let  body  =  '';
          req.on('data',  (chunk:  string)  =>  {
              body  +=  chunk;
          });
          req.on('end',  ()  =>  {
              try  {
                  const  params  =  JSON.parse(body);
                  resolve(params);
              }  catch  (error)  {
                  reject(new  Error('Failed  to  parse  request  body'));
              }
          });
      });
};

路由处理函数 (userRoutes.ts)

//  src/routes/userRoutes.ts

import  {  User  }  from  '../entities/User';
import  {  Connection  }  from  'typeorm';
import  {  parseQuery  }  from  '../utils/parseQuery';

export  const  userRoutes  =  (dbConnection:  Connection)  =>  ({
      '/user':  {
          POST:  (res,  req)  =>  {
              parseQuery(req).then(async  (params)  =>  {
                  try  {
                      const  user  =  new  User();
                      user.name  =  params.name;
                      user.email  =  params.email;
                      await  dbConnection.manager.save(user);
                      res.end(JSON.stringify(user));
                  }  catch  (error)  {
                      res.writeStatus('500  Internal  Server  Error').end(error.message);
                  }
              }).catch(error  =>  {
                  res.writeStatus('400  Bad  Request').end(error.message);
              });
          },
          //  其他处理函数...
      },
      //  其他路由和对应的处理函数...
});

路由入口 (index.ts)

//  src/routes/index.ts

import  {  userRoutes  }  from  './userRoutes';
//  可以在这里导入其他路由模块

export  const  routes  =  (dbConnection:  Connection)  =>  ({
      ...userRoutes(dbConnection),
      //  ...其他路由模块
});

uWebSockets.js 应用 (app.ts)

//  src/app.ts

import  {  create  }  from  'uWebSockets.js';
import  {  Connection,  createConnection  }  from  'typeorm';
import  {  routes  }  from  './routes';
import  {  parseQuery  }  from  './utils/parseQuery';

let  dbConnection:  Connection;

createConnection().then(async  connection  =>  {
      dbConnection  =  connection;
      console.log('Connected  to  the  database');

      const  app  =  create({
          keyFile:  './ssl/key.pem',
          certFile:  './ssl/cert.pem',
      });

      //  设置路由
      const  routeHandlers  =  routes(dbConnection);
      for  (const  route  in  routeHandlers)  {
          for  (const  method  in  routeHandlers[route])  {
              app[method.toLowerCase()](route,  routeHandlers[route][method]);
          }
      }

      app.listen(3000,  token  =>  {
          if  (token)  {
              console.log('Listening  to  port  3000');
          }  else  {
              console.log('Failed  to  listen  to  port  3000');
          }
      });
});

主入口文件 (index.ts)

//  src/index.ts

import  './app';  //  引入主应用文件

//  这个文件可以留空,或者添加一些其他的逻辑

定时事务

//  src/utils/timedTransactions.ts

export  function  startTimedTransactions()  {
      //  每6秒执行一次的事务
      setInterval(()  =>  {
          //  这里调用你的事务处理函数
          console.log('Running  6-second  transaction');
          //  runSixSecondTransaction();
      },  6000);

      //  每33分钟执行一次的事务
      setInterval(()  =>  {
          //  这里调用你的事务处理函数
          console.log('Running  33-minute  transaction');
          //  runThirtyThreeMinuteTransaction();
      },  33  *  60  *  1000);

      //  每天早上1点到5点之间执行的事务
      const  now  =  new  Date();
      const  todayMidnight  =  new  Date(now.getFullYear(),  now.getMonth(),  now.getDate(),  0,  0,  0);
      const  nextRun  =  new  Date(todayMidnight.getTime()  +  (now.getHours()  >=  1  &&  now.getHours()  <  5  ?  0  :  1)  *  24  *  60  *  60  *  1000);

      setTimeout(()  =>  {
          //  这里调用你的事务处理函数
          console.log('Running  daily  transaction');
          //  runDailyTransaction();

          //  设置第二天的时间
          const  tomorrowMidnight  =  new  Date(todayMidnight.getTime()  +  24  *  60  *  60  *  1000);
          setInterval(()  =>  {
              //  这里调用你的事务处理函数
              console.log('Running  daily  transaction');
              //  runDailyTransaction();
          },  tomorrowMidnight.getTime()  -  todayMidnight.getTime());
      },  nextRun.getTime()  -  now.getTime());
}

跨域处理
在uWebSockets.js中,跨域可以通过设置响应头来处理。

//  设置跨域
function  setCrossDomainHeaders(res:  any)  {
      res.writeHeader('Access-Control-Allow-Origin',  '*');
      res.writeHeader('Access-Control-Allow-Methods',  'GET,POST,PUT,DELETE,OPTIONS');
      res.writeHeader('Access-Control-Allow-Headers',  'Content-Type,  Authorization');
}

//  在app.ts中使用
app.options('/user',  (res,  req)  =>  {
      setCrossDomainHeaders(res);
      res.end();  //  对于OPTIONS请求,结束响应
});

Token验证中间件
中间件可以通过拦截请求并在传递给路由处理程序之前执行一些逻辑来实现。

//  src/middlewares/tokenValidator.ts

export  function  tokenValidator(req:  any,  res:  any,  next:  Function)  {
      const  token  =  req.getHeader('Authorization');
      if  (!token)  {
          res.writeStatus('401  Unauthorized').end('Access  denied');
          return;
      }

      //  假设我们有解析token的函数,这里获取用户信息
      //  const  userInfo  =  decodeToken(token);
      const  userInfo  =  {  id:  'user123',  name:  'John  Doe'  };  //  假的用户信息
      req.userInfo  =  userInfo;  //  将用户信息附加到请求对象

      next();  //  调用下一个中间件或路由处理程序
}

将所有内容整合到app.ts

//  src/app.ts

import  {  create  }  from  'uWebSockets.js';
import  {  Connection,  createConnection  }  from  'typeorm';
import  {  routes  }  from  './routes';
import  {  parseQuery  }  from  './utils/parseQuery';
import  {  tokenValidator  }  from  './middlewares/tokenValidator';
import  {  startTimedTransactions  }  from  './utils/timedTransactions';

let  dbConnection:  Connection;

createConnection().then(async  connection  =>  {
      dbConnection  =  connection;
      console.log('Connected  to  the  database');

      const  app  =  create({
          keyFile:  './ssl/key.pem',
          certFile:  './ssl/cert.pem',
      });

      //  设置路由,使用中间件进行token验证
      const  routeHandlers  =  routes(dbConnection);
      for  (const  route  in  routeHandlers)  {
          for  (const  method  in  routeHandlers[route])  {
              const  originalHandler  =  routeHandlers[route][method];
              routeHandlers[route][method]  =  (res,  req)  =>  {
                  tokenValidator(req,  res,  ()  =>  originalHandler(res,  req));
              };
          }
      }

      //  设置跨域
      app.any('/*',  (res,  req)  =>  {
          setCrossDomainHeaders(res);
          //  继续处理请求
          app.run(req,  res);
      });

      //  设置路由
      for  (const  route  in  routeHandlers)  {
          for  (const  method  in  routeHandlers[route])  {
              app[method.toLowerCase()](route,  routeHandlers[route][method]);
          }
    

      app.listen(3000,  token  =>  {
          if  (token)  {
              console.log('Listening  to  port  3000');
          }  else  {
              console.log('Failed  to  listen  to  port  3000');
          }
      });
});

 































标签:const,框架,res,app,req,ts,uWebSockets,js,import
From: https://www.cnblogs.com/pearlcity/p/17975627

相关文章

  • 使用Nuxt框架刷新页面向后端接口请求两次的问题
    背景:当我刷新页面时,发现后端接口被请求了两次前端使用框架:nuxt、vue、axios等后端使用框架:springboot、maven、redis、mybatisplus等主页面程序代码<script>importhomePagefrom'@/api/homePage'exportdefault{data(){return{bannerList:[],//轮播......
  • telegraf解析嵌套json遇到的问题
    问题描述kafka中的数据格式如下:{"customerId":1652,"deviceId":"13011304383","timestamp":1705637828000,"parameters":{"acc":0,"locationStatus":1,&......
  • Jax框架:通过显存分析判断操作是否进行jit编译
    相关:https://jax.readthedocs.io/en/latest/device_memory_profiling.html代码:importjaximportjax.numpyasjnpimportjax.profilerdeffunc1(x):returnjnp.tile(x,10)*0.5deffunc2(x):y=func1(x)returny,jnp.tile(x,10)+1x=jax.random.......
  • angularjs1.x 性能优化笔记
    1.bind-html父级页面如果使用bind-html进行绑定子级组件例如:<divbind-html='vm.template1'><divbind-html='vm.template2'><divbind-html='vm.template3'>如果需要根据某个属性判断是否展示对应vm.template(子级组件)务必将ng-if放置到外部的div上,而不是内部的顶层div里面......
  • ICDM'23 BICE论文解读:基于双向LSTM和集成学习的模型框架
    本文分享自华为云社区《ICDM'23BICE论文解读》,作者:云数据库创新Lab。导读本文《EfficientCardinalityandCostEstimationwithBidirectionalCompressor-basedEnsembleLearning》是由华为云数据库创新Lab联合电子科技大学数据与智能实验室发表在顶会ICDM’23的长文。ICDM......
  • 若依框架入门一源码分析一登录验证码
    若依框架入门一源码分析一关于登录页面的验证码问题前端页面的验证码开关设置的是true,但是打开画面验证码没有被显示,原因是后端代码判断了redis中是否有值,有则覆盖前端<el-form-itemprop="code"v-if="captchaEnabled"><el-inputv-model="loginForm......
  • 解决npm run start 和 node.js src/main.js 引用资源文件路径不一致问题
    解决npmrunstart和node.jssrc/main.js引用资源文件路径不一致问题问题描述写了一个node.js连接sqlite3数据库的项目,因为数据库sqlite3.db文件相对于根目录和src/main.js路径不一致,打包时总有一种方法失败分析原因数据库sqlite3.db文件是相对控制台运行命令的相对路径npmrun......
  • Python将JSON以表格数据格式导出
      本文介绍基于Python语言,读取JSON格式的数据,提取其中的指定内容,并将提取到的数据保存到.csv格式或.xlsx格式的表格文件中的方法。  JSON格式的数据在数据信息交换过程中经常使用,但是相对而言并不直观;因此,有时我们希望将JSON格式的数据转换为Excel表格文件数据;这里就介绍一下......
  • [js] 12位以内的数字转中文
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title&g......
  • 论文翻译 | 【深入挖掘Java技术】「底层原理专题」深入分析一下并发编程之父Doug Lea
    前提介绍DougLea在州立大学奥斯威戈分校(DougLea)摘要本文深入探讨了一个Java框架的设计、实现及其性能。该框架遵循并行编程的理念,通过递归方式将问题分解为多个子任务,并利用工作窃取技术进行并行处理。所有子任务完成后,其结果被整合以形成完整的并行程序。在总体设计上,该框架借鉴......