zoukankan      html  css  js  c++  java
  • NodeJS笔记-ExpressJS框架相关

    这篇随笔记录一些Express和Nodejs 服务端开发的一些问题及记录,随缘更新..

    ---------------------------------------------------------------------------------------------------------

    在做Vue前端开发的时候,经常使用ExpressJS + FakerJS 来模拟API接口数据...

    (虽然有mockjs的api模拟框架..但是mockjs重写了xmlhttpRequest,导致很多npm库不能使用...如threejs....所以不太推荐使用Mockjs那玩意,吐槽:jser总是会时不时的开发出一些奇奇怪怪的框架)

     ------------------------------ 割割割 ------------------------------ 

    ------------------------------ 割割割 ------------------------------ 

     note:例子是TS语言...

    Q.ExpressJS Url参数区分大小写问题:

    expressJS对URL参数的解析是区分大小写的(简陋到爆炸的expressjs)...

    快速解决方法:

    Q.1中间件拦截:

    重定义query为小写或大写

    例子:

      app.all('*', ( req, res, next ) =>
      {
        //将所有带查询参数的URL的qeury转换为小写.... 
        for (let key in req.query)
        {
          req.query[key.toLowerCase()] = req.query[key];
          delete req.query[key];
        }
    
        next();
      });

    Q2.源码修改,修改parseUrl中间件

    上面的方法虽然可以解决大小写区分的问题..但是对URL参数的二次解析,有性能损耗...

    我大概康了下ExpressJS的URL解析部分源码(middleware/query.js中),可以自行修改这块的逻辑

    Q3.Proxy拦截query:

    wait

    Q.ExpressJS http返回中文乱码问题解决:

    响应请求时添加标头:

    res.setHeader('Content-Type', 'text/html;charset=utf-8');

    Express中推荐全局或路由中使用过滤器进行批量注入标头:

      /** 中间件http头设置 */
      app.all('*', (req, res, next) =>
      {
        res.setHeader('Content-Type', 'text/html;charset=utf-8');
        next();
      });

    Q.Expressjs添加静态资源路径,设置Expressjs静态资源路径的URL相对访问路径:

    以某个route为例:

    const route = Route();
    route.use(express.static(path.join(__dirname,'../', '../', 'public'), { extensions:['*'], setHeaders: (res:express.Response, path: string, stat:BigIntStats)=> { //浏览器请求后直接下载到磁盘,不需要请注销 res.setHeader('Content-Type', 'application/octet-stream;'); } }));

    //设置相对路径为/asset
     app.use('/asset', assetRoute);

    Q.ExpressJS 支持Content-Range分段/分片下载例子:

    以某个Route为例,

    例子是以本地硬盘中的资源文件作为分段资源.....如果是内存数据或对象请自行计算大小和分段规则:

    route.get(/public/*.*/, (req, res, next) =>
    {
      let range = req.headers["range"];
    
      let filepath:string = path.join( __dirname, '../', '../',  decodeURI(url.parse((req.url),true).pathname!)  );
    
      res.setHeader('Content-Type', 'application/octet-stream;');
      if (range == undefined) 
      {
        res.statusCode = 200;
        res.download(filepath);
    return ;
      }
    
      if ( !existsSync(filepath) )
      {
        res.statusCode = 404;
        res.end(`not is found...${filepath}` );
        return ;
      }
    
      let [,start, end] = range.match(/(d*)-(d*)/)!;
    
      let stats = statSync(filepath);
      
      let total = stats.size;
      let byte_start = start ? parseInt(start)  : 0;
      let byte_end   = end   ? parseInt(end)    : total - 1;
    
      res.setHeader('Accept-Ranges', 'bytes');
      res.setHeader('Content-Range', `bytes ${byte_start}-${byte_end}/${total}`);
    
      res.statusCode = 206;
      fs.createReadStream(filepath, { start :byte_start, end : byte_end }).pipe(res);
    });

    Node/C++/Native Module

    Node_Module_Version不一致版本问题:

    node-gyp rebuild --target=你的Electron版本号如9.3.0 --arch=x64 --dist-url=https://atom.io/download/atom-shell --abi=80
  • 相关阅读:
    asp.net GDI+绘制矩形渐变
    asp.net GDI+把图片绘制成自定义的椭圆形状
    asp.net TreeView控件绑定数据库显示信息
    asp.net GridView控件中诗选全选和全不选功能
    PHP 笔记——会话控制
    PHP 笔记——String 字符串
    PHP 笔记——Web页面交互
    PHP 笔记——PDO操作数据库
    PHP 笔记——操作MySQL数据库
    PHP 笔记——Array 数组
  • 原文地址:https://www.cnblogs.com/linqing/p/12179820.html
Copyright © 2011-2022 走看看