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
原文地址:https://www.cnblogs.com/linqing/p/12179820.html