0%

最近本地docker构建node项目时报错Cannot use import statement outside a module”,”event”:”uncaughtException。排查解决后,这里mark下。

环境说明

  • NodeJS版本为v12
  • 整个项目是CommonJS规范

错误含义

根据错误栈最后查到是node_modules/axios/lib/core/buildFullPath.js位置。本地开发环境下查看文件并没有问题,但进入docker容器中查看果然该文件中采用的ES import写法。由此确定根本问题。

原因追溯

  1. docker构建时package.lock文件及Node版本都是确定的,按理应该是与开发环境高度一致,但现在出现了不一致,只有可能是docker构建存在缓存之类的。

  2. 查看历史发现之前我曾安装过axios@latest即v1版本,因为安装时不指定版本即会走最新版。查看v1版发布包,发现内容已经变成了ES版本,所以大概原因应该是这样,docker构建环节的问题。查询发现docker builder prune可以清除构建缓存。因此尝试下,重新构建发现OK。

SSH登录失败如遇到kex_exchange_identification: read: Connection reset by peer,可以根据如下步骤排查

ssh时,v参数用于调试信息打印,从信息里可以看到,服务端并没有发送任何消息,如果第一步通讯正常应该或发送远程协议版本信息。

https://static.1991421.cn/2022/2022-10-20-203719.jpeg

大致可能会有几个地方影响

  1. /etc/ssh/sshd_config

    排查端口是否正确,可能并不是22,如果修改配置,需要重启服务生效service sshd restart

  2. /etc/hosts.allow/etc/hosts.deny

    默认两个文件配置会是空状态,没有任何生效配置

注意上述配置文件vi需要sudo或root用户

启动WEB服务时需要绑定IP,日常开发,我们往往这么做,填写0.0.0.0或者127.0.0.1。都work,但两者是不同的,这里总结下两者的不同及注意事项

如下为ExpressJS的一段代码

1
2
3
app.listen(conf.server.port, '0.0.0.0', function () {
console.log(`Example app listening on port http://0.0.0.0:${conf.server.port}!`);
});

127.0.0.1

  1. 该地址为环回IP地址,假如服务绑定该地址,那么使用外网IP,或局域网IP都是不可访问的。

  2. 假如把机器网断了,当执行ping命令时是有返回的,原因是该地址并不会真的走网卡发送请求出去

    https://static.1991421.cn/2022/2022-10-23-123702.jpeg

  3. 当绑定该地址时,访问的话,经常也会使用localhost,但严格来说两者并不对等,因为1个是IP地址,另一个是域名,查看hosts文件也会发现一般会有127.0.0.1 localhost,之所以可以使用localhost,原因在这里

0.0.0.0

  1. 该地址表示本机的所有地址,局域网/外网,所以当绑定时,使用哪个地址都可以正常访问。

写在最后

综上,在配置绑定IP时,需要考虑安全性,从而决定选择哪种配置。只是内部访问就不要配置0.0.0.0

相关文档

最近使用北京易通行扫码坐公交地铁,为了更高效些,开始调研是不是能够做到一键弹出地铁码/公交码,毕竟每次找到App=>启动App=>切换到对应乘车码,这样一套操作还是很麻烦的。

一键唤起App的具体页面功能,该需求能实现的本质就是个URL Scheme,因此关键就是能不能拿到这个信息了。

先说结论,最终我只能实现一键唤起易通行App,即RuubyPay://,而具体地铁码/公交码页面并不行,原因是查不到具体功能/页面的介绍SDK,或者没有猜出来。虽然没有彻底解决,但至少搞清楚了寻找指定App URL Scheme的一般方法了,以后有此需要就这么来搞。

基本方法

  1. Google/GitHub检索

    首先还是万能搜索大法,毕竟别人很多都想到和找到了,比如微信扫码weixin://scanqrcode

  2. 官方文档

    好点的软件对其URL Scheme支持是有系统介绍的,比如Surge/Things等,通过官方文档就可以了解能支持到什么程度。这点微信,美团之类的都没系统的介绍,基本都靠网友自己去找了,这点差评。

  3. iMazing等软件查看app中的info.plist,如果是Mac App的话,直接finder中查看app内容即可,不需要第三方App

    info.plist中检索CFBundleURLSchemes关键词,具体数组值即Scheme

https://static.1991421.cn/2022/2022-10-16-211355.jpeg

  1. 很多App对应网页版经常有点击跳转到对应App,这个跳转链接就是URL Scheme,抓取到网页内容中的该链接即可。比如腾讯会议的网页链接中的一键加入会议,又比如招商银行的活动页,一键打开,通过简单的调试就可以得到URL Scheme。

    https://static.1991421.cn/2022/2022-10-16-214238.jpeg

注意

  1. Scheme区分大小写,比如RuubyPay://可以唤起易通行,而rubbypay://报地址不对
  2. 一个App的Scheme支持多个,也可以没有,这点完全取决于App开发者
  3. info.plist这种办法只能解决唤起App,但是具体页面路径不得而知,因为该部分并不在该文件中提前定义,而是具体代码中实现。具体页面除了SDK/网页代码中抓取,就只能猜了。Scheme正确而路径错误的情况下App是可以正常被唤起,只是无法执行对应动作。
  4. 苹果系统下,iPad/iPhone/Mac均有Scheme支持

特别用途- check目标App安装状态

URL Scheme除了可以用于快速换起某App/具体功能之外,还有个特殊用途即可以查询某App是否安装。

使用方法

  1. info.plist中声明这些App需要查询

    注意URL Scheme query的数量限制为50

1
2
3
4
5
<key>LSApplicationQueriesSchemes</key>
<array>
<string>myapp1</string>
<string>myapp2</string>
</array>
  1. 代码中调用,根据返回值true/false来确定App是否安装
1
UIApplication.shared.canOpenURL(URL(string: "myapp1://test")!)

题外话

之所以了解到该用法是因为taio作者利用这个能力检查用户是否装了Surge类MitM工具进而导致被用户喷。做法虽然过分,但技术无罪,了解下无妨。 相关讨论贴见大家是怎么看待 Taio 的这种行为的

相关文档

更新

YouTube印度已锁区,只支持印度地区的银行卡。

因此按照如下方法走土耳其区购买,即将代理及Google账户地区切换到土耳其即可

刷YouTube视频现在属于高频操作,不过免费版广告太多太频繁。Surge/AdBlock是个办法,但也有副作用,因此还是走会员购买这条路了。

YouTube会员地区收费有所区别, 印度良心些,个人会员(129印度卢比即11.23RMB)/月!但印度会员购买还是有些门槛儿的,这里Mark下我的操作流程。

准备条件

  • visa双币卡,支付需要
  • 目标国家即印度代理,需要是原生IP
  • Google账户

印度代理

如果有印度代理的忽略该步骤,没有的需要购买印度区云机器,

购买印度机器

推荐Vultr等云厂商,这里均按分钟计费

  1. Vultr
  2. DigitalOcean

不推荐云厂商

  • lightnode- IP仍然会被识别为HK

搭建代理

  1. 如果有Surge,建议直接走SSH代理,如果没通,就配置代理链。
  2. 不支持SSH代理的,建议手动搭建代理,https://alanhg.github.io/v2ray-docker

代理搭建OK后,确保访问时IP地址所在地为印度即可

访问油管,也显示为India,同时点击会员开通,显示的价钱单位是对应国家货币单位

关于付费

属于印度代理网络下后即可正常进行订阅付费,同时如果中途需要更新付费方式等,这点YouTube网络没有限制,比如香港代理等也可以正常的更新支付方式,印度IP仅限于会员激活开通这块。

修改Google账户所在国家/地址

https://pay.google.com/gp/w/u/1/home/addressbook

加入YouTube家庭会员

有时是拼车加入YouTube会员,注意一点假如是印度会员,你需要是印度IP下点击激活链接,否则会提示激活失败。

Premium优势

这里列下我开通premium的刚需点

  1. 无广告
  2. 背景播放

写在最后

YouTube很香,因此折腾下订阅,值。