所有由罗佳(博主)发布的文章

[Browserify]异步插件导致write after end错误

写了个Browserify插件,之前一直没问题,但今天我改了点打包流程,结果一直报`write after end`错误,找了半个晚上,发现是因为我的插件函数写的是异步的,里面有个await异步读文件。

之前一直没出问题是因为后面的打包流程时间够长,能让这个插件正常执行完,但今天改了流程之后部分情况下很快就执行完了,于是当插件异步流程执行完后继续就出错了,修正方法是把异步文件读取改成同步的。

[Node.js]进程异常退出,错误码 3221226505

不是我想水一篇博文,在解决完前一篇博文的问题之后,立刻就又碰上另一个奇葩问题,进程直接跑着跑着没了,留下一个错误码3221226505。

在我左思右想把代码改来改去,包换来换去之后依然不能解决问题,然后发现是canvas包的问题,之所以一直没有发现是它,是因为出问题的代码里并没有用到这个包,它是在别的地方被引用到的,可能它的二进制模块破坏了node的环境,导致别的代码执行的时候触发了异常导致程序崩溃。

这个问题其实也不是第一次出现了,而且每次都是因为项目中同时有canvas和sharp两个模块才出现问题,在某些版本下不会出问题,某些版本下又会出现不一样的错误,这次就是和上次不一样所以才没能快速发现。

就这点破事,又浪费了我一个晚上,这时候我真想给搞出这bug的人屁股上来一脚。

IIS反向代理站点跳转域名被替换

今天一个破问题浪费我一下午的时间,我一直在找自己代码是不是有什么问题,或者是不是express有什么bug,结果到最后发现原来是iis的问题。

如果是在win上用iis反代站点的话,通常都会用iis的requestRouter插件,在他的设置页面`Application Request Routing`里网上的教程通常都勾着`Reverse rewrite host in response headers`这一项,就是因为这个设置导致后端返回的http头中location指定的跳转地址被替换为了此站点的地址,不知道这是个什么智障操作。

TrueNAS启用pkg包管理器

这是一篇小笔记,truenas默认没法使用pkg install来安装包,会出现以下报错

“`shell
pkg: file:///usr/ports/packages/meta.txz: No such file or directory
…..
pkg: file:///usr/ports/packages/packagesite.txz: No such file or directory
Unable to update repository local
“`

解决方案是进入`/usr/local/etc/pkg/repos/` ,把`local.conf`中`enabled`后的yes改成no,把`FreeBSD.conf`中`enabled`后的no改成yes即可。

 

方案来源 : https://www.justinsilver.com/random/fix-pkg-on-freenas-11-2/

[MySQL]在普通字符串字段中存放json数组并索引

之前有一篇文章写的是在mysql中使用json字段时为其中的数组创建索引,它有个问题就是当该字段本身存放的就是一个数组时(不放在对象下的属性中),这样创建的索引不生效,原因不明。因此要使索引生效需要把数组放在对象下的一个属性里。

现在我发现,如果想要在mysql中存放一个可以索引的json数组,其实根本不需要使用json字段,即使是普通的字符串字段存放的json数组也可以用同样的方法进行索引。

比如现在有一个字段`tags`,类型为`mediumtext`,在其中一行存放了以下字符串:

“`json
[1,2,3,4,5,6,7,8,9,10]

“`

然后将其解析为json来创建多值索引:

“`sql
ALTER TABLE 表 ADD INDEX tag_idx((cast(JSON_EXTRACT(tags, ‘$’) as unsigned array)))
“`

接着在查询数据时也把该字段解析为json进行使用:

“`sql
SELECT *
FROM 表
WHERE JSON_OVERLAPS(‘[1,2]’,JSON_EXTRACT(tags, ‘$’))
“`

在这样的查询中,mysql就会使用到这个json数组的索引,因此如果一个数据仅仅是为了作为数组使用的话就没必要套个对象放进json字段了,使用普通字符串字段即可。

[MySQL]member of 不走索引

刚刚发现程序里有一个语句,是一个unique主键 member of(返回json数组的子查询),但它就是不走主键索引,接着我把子查询换成了一个手写的json串,像这样

SELECT
    tag_id
FROM
    tags FORCE INDEX ( tag_id_unique ) 
WHERE
    tag_id member of (JSON_EXTRACT( '[1,2,3]', '$' ))

发现即使是指定了索引也还是不走索引,可能member of就是这样的机制? 目前原因还不清楚,于是我先用了另一个办法。

继续阅读[MySQL]member of 不走索引

25岁

25岁啦。

这一年没做什么值得瞩目的项目,多数时间还是用在处理公司一大堆繁杂小事上了,同时也在做公司的在线系统和平台。

由于每天都公司和家两点一线的原因,周末也不高兴出去玩,所以到现在还是单生狗,现在是大龄单生狗了。

按照惯例,我应该要画一张琪露诺作为新的头像,但目前还没开始画,等画完了贴上来。

node-socksInTheMiddle

写了个用于修改http、https请求和响应的node服务,它会启动一个socks5服务端,然后把你的代理设置成这个服务端口,在代码里写上你的修改逻辑即可。

名字取自Man-In-The-Middle,把人改成了socks。

NPM : https://www.npmjs.com/package/socksinthemiddle

Github : https://github.com/JiaJiaJiang/node-socksInTheMiddle

继续阅读node-socksInTheMiddle

[javascript]字符串映射到固定颜色

碰到一个需要给图表上数据打颜色的场景,我希望对于同一个名字的数据每次出来的颜色都是一样的,于是想了半分钟,搞出了这么个方案
“`javascript
function strToRGB(name){
let sum=0;
for(let s of name)sum+=s.codePointAt(0);
return [sum%128,sum%126,sum%124];
}
“`
原理是把每一个字符的unicode值累加起来,然后对这个和分别取3个余数。

除数选1到256都可以,选多少取决于希望结果出现在哪个范围,我这里为了让结果颜色偏暗,所以选了128左右的除数。

MySQL mbind: Operation not permitted

刚刚mysql启动不起来了,翻了翻docker日志,里面全是`mbind: Operation not permitted` ,然后netstat看了看也没别的程序占用端口,怎么就没权限监听端口了呢。

咕咕查了查,都是说和docker-compose有关的答案,但是我没用它,只好再研究是什么原因。

直到我编辑了一个文件然后保存的时候终于知道是什么问题了,它报了个硬盘空间不足,估计又是什么log把硬盘撑爆了,然后就du命令一路找,找到了一个9个多G的docker容器log,删掉它之后重启docker,mysql也可以启动起来了。

为了防止问题再发生,给docker容器设置了个log大小限制。

Windows半夜自动开机

首先容我说一句,搞出自动唤醒电脑更新系统这个策略的人是烧饼,搞出更新后无视用户任务自动重启电脑的人也是烧饼,说不定还是同一个人。

从Win10开始就有不少人遇到了这个问题,最后发现是系统更新半夜唤醒了电脑,关闭方法是在“任务计划程序”里找到”\Microsoft\Windows\UpdateOrchestrator\Schedule Wake To Work”这一项,把它禁用,如果提示权限不够无法操作,可以搜索一下如何禁用这个任务计划。

这篇文章我要说的是另一个问题,自从升级到Win11之后,之前在10里面已经改过的设置又被改回来了,又开始每天晚上自动开机跑更新,而且即使再改,它依然会被恢复到默认状态,晚上还是会自动开机,真实烧饼行为。于是只能换个办法来解决这个问题,我找到的一个办法是,既然任务计划唤醒电脑靠的是唤醒定时器,那么只要把唤醒定时器整个禁用掉应该就好了。

关闭方法是在当前的电源计划设置里找到“睡眠”→”允许使用唤醒定时器“,把启用改成禁用即可。现在几个晚上下来都没有再出现自动启动的情况了。

继续阅读Windows半夜自动开机