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
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;
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