dljia
  • 前言
  • es6
    • promise
    • 箭头函数
  • http相关
    • ajax请求中contentType和dataType
    • async和defer的区别
    • cookie、session和token
    • http协议介绍
    • http缓存
    • 转发和重定向
  • js
    • 1-js深浅复制
    • 10-节流防抖
    • 11-Promise常见手写
    • 2-js函数值传递
    • 3-js原型链详解
    • 4-js基础讲解this篇
    • 5-call、apply和bind
    • 6-js中的继承
    • 7-闭包与立即执行函数
    • 8-js事件循环
    • 9-js模块化
  • react
    • React-diff
    • React-fiber
    • React组件设计规则
    • mvc与mvvm
    • react-router
    • react懒加载
    • redux
    • setState源码分析
    • webpack+react从0项目构建
  • ts
    • Typescript编程书籍导读
    • 体操基础
  • 其他
    • gitbook简易配置教程
    • gitbook转pdf电子书
  • 微前端
    • pnpm
    • qiankun
    • single-spa源码分析
    • 几种微前端架构的选型
  • 转载
    • interview-1
    • interview-2
    • interview-3
    • 经验好文
  • 项目经验
    • 23年总结
    • [Arkts 学习笔记](项目经验/Arkts 学习笔记.md)
    • Grafana插件
    • JSDoc
    • electron-builder构建的安装包,安装时通过nsis脚本自动导入注册表
    • overflow-yautohiddenscroll和overflow-xvisible组合渲染异常
    • webpack
    • 前端工程化
    • 前端性能优化思路
    • 前端性能监控工具
    • 前端架构
    • 前端登录流程
    • 前端监控原理
    • 团队管理
    • 基于node实现简单server
    • 如何对业务进行深挖
    • 如何拉齐横向
    • 如何画图
    • 如何记录
    • 组件库
Powered by GitBook
On this page
  • 背景
  • 开始搭建

Was this helpful?

  1. 项目经验

基于node实现简单server

背景

由于客户端需要与浏览器端进行一定的通信,客户端使用的是electron可以直接使用node进行搭建本地服务。如果使用类似于koa express等常用框架由于业务需求没那么复杂,所以我需要简单封装一个基于node的server

开始搭建

  1. 使用http模块 创建端口监听

    const http = require('http');
    const router = require('./router');
    // 注册路由
    require('./router-instance');
    http.createServer((request, response) => {
    router.do(request, response);
    }).listen(9876);
  2. 完善路由 思路简述 :

    • 使用path-to-regexp于querystring进行路由匹配和参数解析

    • router使用立即执行函数构造一个类 其中get 和post方法是再数组中存储一个个对象,对象具有两个参数 注册路由实例时的url与匹配路由时需要执行的函数

    • do 方法供http模块调用 当监听到请求时执行此方法

      ```javascript

      // 简单的路由parser

      const pathToRegexp = require('path-to-regexp');

      const querystring = require('querystring');

function parseUrl(routerJSON, path) { let cb = false; const match = {}; for (let i = 0; i < routerJSON.length; i += 1) { const keys = []; const re = pathToRegexp(routerJSON[i].url, keys); const res = re.exec(path);

if (res) {
  match.url = res[0];
  match.path = routerJSON[i].url;
  const tempObj = {};
  for (let j = 0; j < keys.length; j += 1) {
    tempObj[keys[j].name] = res[j + 1];
  }
  match.params = tempObj;
  cb = routerJSON[i].callback;
  break;
}

}

return { cb, match, }; }

const router = (function (

) {

const routerOption = { GET: [], POST: [], };

return { get(url, callback) { routerOption.GET.push({ url, callback, }); }, post(url, callback) { routerOption.POST.push({ url, callback, }); }, do(request, response) { // 根据url找到匹配的函数 const url = request.url.split('?')[0]; const method = request.method; // 匹配路径,支持resful const res = parseUrl(routerOption[method], url); request.match = res.match; // 接收post请求参数 if (method === 'POST') { let data = ''; request.on('data', (chunk) => { // chunk 默认是一个二进制数据,和 data 拼接会自动 toString data += chunk; }); // 3.当接收表单提交的数据完毕之后,就可以进一步处理了 // 注册end事件,所有数据接收完成会执行一次该方法 request.on('end', () => { // (1).对url进行解码(url会对中文进行编码) data = decodeURI(data); // (2).使用querystring对url进行反序列化(解析url将&和=拆分成键值对),得到一个对象 // querystring是nodejs内置的一个专用于处理url的模块,API只有四个,详情见nodejs官方文档 const dataObject = querystring.parse(data); request.dataObject = dataObject; res.cb && res.cb(request, response); }); } else { res.cb && res.cb(request, response); } }, }; }()); module.exports = router;

3. 注册路由实例(demo)

const router = require('./router'); router.get('/testConnect', (req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain', 'Access-Control-Allow-Origin': req.headers.origin, 'Access-Control-Allow-Credentials': true, 'Access-Control-Allow-Methods': 'GET', }); res.end(responseJSON(200, 'success')); });

```

Previous团队管理Next如何对业务进行深挖

Last updated 4 years ago

Was this helpful?