[expressjs]捕获路由和中间件的异步错误

express本身可以写async函数作为路由或者中间件(以下简称路由)使用,但如果在其中直接抛出异步错误的话则不会被捕获并传递给错误处理路由,需要在每一个async路由中手动写try/catch来捕获并处理错误,这显然对于拥有统一错误处理逻辑的框架是不友好的。

我不知道为什么express始终没有在4.x版本添加这个支持,看起来这应该并不会导致什么兼容性问题,即使不默认全局开启这个功能,也可以添加一个选项或开关函数来允许使用者开启异步错误捕获,但它始终没有这么做。

在这之前npm上也已经有一些可以实现这个功能的补丁包,不过它们几乎都是给创建出的app实例的所有相关路由方法套了一层壳在里面try/catch错误,导致如果是自己用一些特殊方法创建的路由对象,就失效了。

我原本用了一个直接修改express源码中相关原型方法的包,叫做express-async-errors,不过这个包没考虑到项目引用其它位置的express包的情况,它直接在代码中对相关源文件进行了require,导致无法作用于项目外依赖库的express,所以我重写了一个,而且源码比它还要简单,因为我直接把Layer类的handle方法改成了async函数,然后在里面await我们的路由函数,目前还没发现什么副作用,在我的项目中直接使用没有出现问题。

包地址:express-async-error-patch

asyncPatch函数需要传入一个创建出来的app实例, 为的是能获取到app所属的express包里的构造函数,不是为了在实例上包装方法。该函数在任何阶段调用都可以,只要在处理请求前调用即可。

2023

大家新年快乐!

我的新冠总算是阴了,但还有些咳嗽,可能是老毛病了。

2022年依然没有做完什么大事,琐碎的事情一大堆,而且还经历了几个电视剧里才能看到的剧情。只能说虽然自己没做什么,但生活经历真实丰富。

虽然按照现在冠状病毒的变异和治病效果来看,2023年总体上肯定也是乱七八糟的一年,不过还是祝大家能安安稳稳度过!

Sony WH-1000XM3清洗耳罩

这耳机从买来到现在从来没清洁过,其实用得也不算多,但耳罩上还是越来越油了,光是擦实在不能擦干净,所以我决定还是要拆下来洗洗。

网上查了一下,实际上很好拆,只要拿个比较扁平细长的硬物插进耳罩卡扣附近边缘的缝隙里往上撬就行了,具体哪里有卡扣可以参考下面两张图。

当然如果你怎么撬都出不来也千万不能大力出奇迹,不然耳套皮必坏。正确的感觉应该是往上撬时能明显感觉到有东西被撬起来了,如果没有这种感觉就不要硬掰了,换个位置重试吧。

清洗的时候我就用水冲了之后拿洗手液搓了搓,冲干净然后压一压把水挤出来,最后放机箱上烤了半天就好了。安装回去的时候只要注意好左右耳(上面的定位柱位置不一样)然后按回去就行了。

阳人日记

昨天(12月21号)凌晨3点40分,我突然醒来,感觉浑身冰凉,就像全身结冰一样,接着就是如同平时在寒冷环境下打寒颤一样,全身所有的肌肉都在发抖生热。当时抖得我除了缩在被子里,几乎没有办法做其它动作,也不敢做其它动作,生怕不缩着就要冻死,只能勉强伸手拿枕边的空调遥控器开了空调之后继续缩在被子里。

就这样我在被子里全身打寒颤20分钟之后,终于感觉到体温回来一点了,虽然还是感觉很冷,但已经能够稳住手操作手机了。看了下时间,这时候已经是4点整了,我赶紧打电话给隔壁房间的老妈申请场外援助,让她帮我搞点热水,结果就听到外面一阵叮铃当啷,15分钟后热水还是没来,只好再打电话给她,但她手机放房间里了,听不见,只好通过监控来和她通话,原来是在厨房烧姜汤😓。我说我快冻死了,先来热水,别的之后再说,这才终于得到了热水。

21号白天我基本上除了咳嗽和头晕无力,没什么别的感觉,几乎一整天我都在睡觉,而且是穿着棉袄开着空调裹在被子里加体温,给免疫系统加把力。

22号已经基本恢复运动能力,就是依然在咳嗽和流鼻涕,但头已经不晕了,现在应该已经进入了最后阶段,不过还是不能大意。本来我一直也不能确定到底是不是得了新冠还是别的问题,因为之前看到别人的症状描述,没有说会冷那么长时间的,于是今天拿之前封控时留下的抗原检测盒试了一下,果然是新冠。

中间几天都是喉咙痛

27号喉咙好一点了,要发出声音不会太费劲了。

28号喉咙更好一点了,但有点头晕,不知道是不是因为太热我减少了衣物之后着凉了。

Sony WF-1000XM4换电池

我这WF-1000XM4买来在质保期内已经换过左耳单元,所以所以左耳电池寿命还没什么问题,但右耳的电池已经连半小时都撑不到了,太离谱了。

因为刚好过了质保两个月,问了客服,也是说质保已过,而且他们不会换电池,要解决就得直接买整个耳机单元好像大概500元左右,那谁高兴去搞,万一换完了过一年又这样呢,于是我勉强就这么先用着。

上星期我本想逛逛看看有没有什么替代品,偶然看到有些耳机维修业务,然后顺着搜了一下,果然有专门给这耳机换电池的,但是一看价格劝退了。然后我搜了一下是否有教程,看了看好像也不难,于是按照搜到的电池型号买了个电池回来自己换。

首先拿掉耳塞,用热风枪开100度对着耳机一直吹,吹到整个耳机都发烫之后就可以开始用美工刀撬了,有条件的话最好用风枪一直对着吹,避免冷却增加难度。

撬的时候用美工刀顺着耳机的接缝插进去,然后上下掰动,力道适当几乎不会留下痕迹。慢慢多来几下,缝就会越来越大,缝到足够指甲塞进去的程度之后直接用手掰就行了,但是一定要小心,因为两半里面是有排线连在一起的,掰开后就是如下图:

继续阅读Sony WF-1000XM4换电池

26岁了

时间过得真快,一下子就过去了一年。

去年的生日画还没画完,而且原稿psd跟着之前的SSD一起去世了,现在只剩当时输出的半成品,不知从何下手,不过之前novelAI泄露的时候我拿那个模型给我的半成品跑了一下,出图还挺可爱的,不过不是我画的,所以就不放出来了。

另外今年依然是单身。

[git]fatal: detected dubious ownership in repository at

这是一篇笔记,因为是第二次碰到了,记录一下,下次好找。

Git的新安全策略会导致使用git操作无所有权的仓库目录时报此错误,要解决可以有以下方案:

  1. 把目录的权限修改正确,就不会有这个提示了。
  2. 把目录添加到信任列表
    • git config --global --add safe.directory "目录路径"
  3. 如果不想那么麻烦对所有出问题的目录进行这样的操作的话可以直接信任所有路径。目前还没研究该安全策略是为了避免什么问题,不知道这样做是否会造成什么不良后果。
    • git config --global --add safe.directory "*"

[WebGL]使用javascript控制模型形变

此博文由一个话题引出,原话题是通过滑条控制页面上显示3D模型的某个部分,于是我就来尝试了一下。

由于Three.js我也已经2年没碰了,而且在项目里只用过一次,所以并不是很清楚它是否能通过本身的功能达到这个效果,甚至一开始我已经在想手搓点坐标来达到目标了。

但手搓点坐标实在太麻烦了一点,我就回到blender想看看通常用于控制形变的形态键是否可以导出来使用,然后发现确实可以,这样就方便了,只要控制形态键的数值就可以对模型的形态进行定量控制,以下是操作过程: 继续阅读[WebGL]使用javascript控制模型形变

自动裁剪nginx log

今天博客莫名其妙开始报数据库连接错误,重启了之后也还是一样,一看mysql日志,看来又是老问题,硬盘空间被占满了。

每次都要等到出问题了再来删日志实在太麻烦,查了一下nginx也没有自带缩减日志的功能,查到有用logrotate来自动分割和压缩日志的,不过我只是想简单地把日志文件缩小,能看到最近的日志就够了,所以还是自己写个脚本。

代码很简单,用tail命令把日志文件的最后20000行裁出来存到新文件,然后用新的日志文件替换旧文件,把这个脚本放到cron的daily目录中每日执行一次即可

cd nginx日志目录
tail -n 20000 -q access.log > access.log.new
mv access.log.new access.log
tail -n 20000 -q error.log > error.log.new
mv error.log.new error.log

这段脚本把access.log和error.log都裁剪了。

要注意的是这种办法虽然简单,但是如果在tail执行的时候nginx又向日志文件写入了新的内容,这部分内容可能会被丢弃,所以只能用于我这种简单场景,对于日志有严格保存需求的场景不能使用该方法,应该用logrotate。

大龄单身狗的日常