本篇主要记录一些小技巧或者开发过程中遇到的小问题和解决方案。这些问题实在太小了而且大部分可能和代码没有关系,不好每次都单独列一篇文章,所以放到一起了。
在eclipse中设置字体
在eclipse中设置 Windows->Preferences->General->Appearance->Color and Fonts->Basic->Text Font->Edit->脚本(R) 选择 中欧字符
后中文字体的显示能够更好看些。
处理 nginx + php 遇到后端返回413错误
php 默认上传文件大小限制为 2M,如果超出 2M 你需要修改 php 配置文件 php.ini 里面的参数
1 | post_max_size = 128M ## (表单提交的最大限制,此项不是限制上传单个文件的大小,而是针对整个表单提交的数据进行限制) |
需要保证 post_max_size >= upload_max_filesize ,也就是前者不小于后者。修改之后一定要重启 php-fpm (service php-fpm restart)。
除了修改 php 配置,你也需要修改nginx配置文件 nginx.conf
打开 nginx 配置文件 nginx.conf,找到 http{} 段,在其中添加一行配置:
client_max_body_size 128m; 其中 128m 可以根据需要上传文件大小自行设定。
修改之后一定要重新载入 nginx (service nginx reload)。
导入/导出 csv文件到mysql
导入
需要表存在且字段与csv文件中的相同
1 | LOAD DATA LOCAL INFILE '${csv文件路径}' |
导出
1 | LOCK TABLES ${数据库表名} read; |
导出csv文件到mysql报错
Error 1148
如果在执行语句时报错 Error 1148 MySQL The used command is not allowed with this MySQL version
可能是因为MySQL的安全策略阻止读取本地文件,可以通过以下方法解决:
- Use –local-infile=1 argument on the mysql commandline:
When you start MySQL on the terminal, include –local-infile=1 argument, Something like this:
1 | mysql --local-infile=1 -uroot -p |
Then the command is permitted:
1 | Query OK, 3 rows affected (0.00 sec) |
- Or send the parameter into the mysql daemon:
1 | mysqld --local-infile=1 |
- Or set it in the my.cnf file (This is a security risk):
Find your mysql my.cnf file and edit it as root.
Add the local-infile line under the mysqld and mysql designators:
1 | [mysqld] |
Save the file, restart mysql. Try it again.
- The main reason why we are using the LOCAL keyword is explained in the MySQL manual. On the other hand, you do not need the FILE privilege to load local files. So if you in fact do have file access to the server then try to skip using the word “LOCAL” in SQL query, and instead copy the file to the server and the directory mysql/data/[tablename].
Error 1290
如果在执行语句时报错 [Error Code] 1290 - The MySQL server is running with the --secure-file-priv option
说明参数secure-file-priv 可能有问题
执行以下语句
1 | SHOW VARIABLES LIKE "secure_file_priv"; |
可以看到
1 | secure_file_prive=null -- 限制mysqld 不允许导入导出 |
可以在 my.ini(windows) 或 /etc/my.cnf(linux) 文件中的[mysqld]节点添加secure_file_priv=’’,然后重启mysql服务
启动mysql报错error: 11
如果在启动mysql时遇到了 [ERROR] InnoDB: Unable to lock ./ibdata1, error: 11
说明 ibdata1 文件被其他的进程占用 或者 磁盘空间目录不足,有以下解决方案:
- 查看磁盘空间情况
1 | df -h |
- 查看系统 mysql 相关进程
1 | ps -eaf | grep mysql |
如果语句执行正常但是返回 0 row(s) affected
,查看一下csv中的字段是否是否与表中的字段一致,区分大小写;查看一下csv文件的分隔符的设置是否正确。
处理 mongoose 中 bson MODULE_NOT_FOUND 相关报错
node.js 在使用 mongoose时报错 [Error: Cannot find module '../build/Release/bson'] code: 'MODULE_NOT_FOUND'
参见 https://github.com/Automattic/mongoose/issues/3436
应该是mongoose版本问题,理论上升级到最新版本可以解决,也可以按照以下步骤解决
- 更改 bson 引用
找到 module mongodb ..node_modules\mongodb\node_modules\bson\ext\index.js
改变bson引用的路径
1 | bson = require('../build/Release/bson'); |
改为
1 | bson = require('../browser_build/bson'); |
或
1 | bson = require('bson'); |
- 更改mongoose版本
将原有的mongoose升级为"mongoose ": "~3.8.23"
Python 报错 ‘ascii’ codec can’t encode characters in position 0-8:ordinal not in range(128)
- 第一步,别忘了给文件顶部加上
1 | # -*- coding: utf-8 -*- |
- 重新载入SYS模块并设置uft-8
1 | import sys |
使用nvm的前置脚本
1 | export NVM_DIR="$HOME/.nvm" |
快速启用httpserver
1 | python -m SimpleHTTPServer 8080 |
启动 mongodb 数据库服务
1 | mongod --dbpath=/users/ |
启动 redis 数据库
1 | redis-server |
显示为大写字符,在选中复制后发现原文为包含大小写的字符
如下所示:
原因是采用了 Bebas Nene 这款字体,这款字体对小写字符也显示成大写的样式。
字符tooltip
鼠标hover会显示tooltip
只需要设置下DOM元素的 title
属性
node内部模块
从 Node.js 12.2.0 版本开始,支持使用 const fs = require('node:fs');
的写法。这种写法被称为 “内部模块”(Internal Modules)。
内部模块的目的是为了解决在 Node.js 中使用内置模块时可能出现的命名冲突问题。在旧的写法 const fs = require('fs');
中,如果你在项目中有一个名为 fs.js 的文件,那么 require('fs')
将会加载你的 fs.js 文件而不是 Node.js 的内置 fs 模块。
通过使用 require('node:fs')
,你可以明确地指定要加载的是 Node.js 的内置 fs 模块,避免了命名冲突的问题。
需要注意的是,内部模块的写法只适用于 Node.js,不适用于浏览器端的 JavaScript。在浏览器端,仍然需要使用 require('fs')
的写法来加载模块。
process.env.npm_lifecycle_event
在 package.json 的 script 中书写了一个命令 “custom-command” 在 env.js 中通过”require(‘child_process’).execSync(‘npx another-command’)“ 执行了另外的命令。Nodejs 14 中 process.env.npm_lifecycle_event 会返回 custom-command 但在 Nodejs 16 中 process.env.npm_lifecycle_event 会返回 npx。
在 Node.js 14 中,process.env.npm_lifecycle_event 返回 “custom-command”,因为它只关注 npm 生命周期事件的名称。但在 Node.js 16 中,process.env.npm_lifecycle_event 返回 “npx”,因为它将整个命令行作为一个事件处理。
这个更改是为了提供更准确的事件处理信息,以便开发者能够更好地理解正在执行的命令。通过返回整个命令行,开发者可以知道是通过 npx 工具执行了哪个命令。
如果需要在 Node.js 16 中获取 “custom-command”,可以不调用 npx 直接执行 another-command 或者可以通过在 env.js 中传递参数的方式来实现。在 package.json 的 script 中,可以使用 – 来传递参数,然后在 env.js 中通过 process.argv 来获取这些参数。
1 | "scripts": { |
1 | const args = process.argv.slice(2); |
error:0308010C:digital envelope routines::unsupported
运行 >17 的 Nodejs 脚本时报错“error:0308010C:digital envelope routines::unsupported”,
因为高版本的 Nodejs crypto 模块 使用了 OpenSSL3.0,OpenSSL3.0 对允许的算法和密钥大小进行了限制,使用不允许的算法是会抛出 “error:0308010C:digital envelope routines::unsupported” 的错误,报错如下:
1 | ERROR in ./src/epmp-apps/epm_p/taskCenter/main/index.js |
可以直接在nodejs中运行相应的脚本查看对应报错:
1 | >require('cryto').createHash('md4'); |
OpenSSL 是一个强大的开源安全套接字层密码库,它提供了功能丰富的安全工具包用来处理对称与非对称加密算法、数字证书编解码等。Nodejs 的 crypto 模块就是用了 OpenSSL 的能力进行加解密的。Nodejs 从 17版本开始用了 OpenSSL3.0,OpenSSL 3.0 中提供了5个 Provider(表示算法实现的容器),其中:
- default: 默认,提供了所有标准的内置算法,如果没明确指定则将使用默认算法容器;
- legacy: 遗留,意不常用或者被反对使用的算法,正常情况下不可用,除非现实的指定使用 legacy 容器;
许多流行的库使用到了 crypto.createHash("md4")
来创建哈希串,所以在高版本 Nodejs 中执行会报错。
已知的库包括:
babel-loader@8.2.4 解决了该问题 Use md5 hashing for OpenSSL 3 by @pathmapper in #924
webpack@4.47.0 解决了该问题 [Security] - Add support for md4 in Node >=18. by @iclanton in #17628
webpack@5.61.0 解决了该问题 use a wasm md4 implementation for node 17 support
@vue/cli-service@5.0.1 支持了 webpack@5.61.0
react-scripts@5.0.0 支持了 webpack@5.61.0
如果遇到该问题我们可以:
- 升级项目中所有依赖的库到解决该问题的版本
- 提供 legacy 容器环境,即执行脚本之前先执行
cross-env NODE_OPTIONS=--openssl-legacy-provider
(安装 cross-env 以支持跨环境脚本)设置环境变量或者在系统环境变量中添加变量名为NODE_OPTIONS
值为--openssl-legacy-provider
的环境变量 - 降级 Nodejs 版本,降级到 Nodejs 16,在脚本中进行Nodejs版本检查,不符合要求时进行升级
在弹窗中使用 beautiful-react-dnd 时拖拽元素的位置时有不正确的偏移
原因是父元素弹窗使用了 transform 进行定位,而 beautiful-react-dnd 在定位元素时使用了 position: fixed
,参见 MDN 对 fixed 属性的解释:
元素会被移出正常文档流,并不为元素预留空间,而是通过指定元素相对于屏幕视口(viewport)的位置来指定元素位置。元素的位置在屏幕滚动时不会改变。打印时,元素会出现在的每页的固定位置。fixed 属性会创建新的层叠上下文。当元素祖先的
transform
、perspective
、filter
或backdrop-filter
属性非 none 时,容器由视口改为该祖先。
所以拖拽元素的 top,left 等属性的定位从浏览器改为了弹窗元素,但 beautiful-react-dnd 仍旧是以浏览器计算的,所以会出现问题,解决方案参见 https://github.com/atlassian/react-beautiful-dnd/issues/485#issuecomment-754398585 将拖动元素的 left 和 top 属性强制改为 auto。但是如果拖动的元素在可滚动的元素内时,一旦发生了滚动,此时位置又会出现错乱。解决办法为使用 React.createPortal()
将拖拽元素脱离文档流进行渲染。参见 https://github.com/atlassian/react-beautiful-dnd/blob/master/stories/src/portal/portal-app.jsx
执行 npm publish 时未发布到期待的源
执行 npm config set registry https://registry.npmjs.com/
也不行,
在发布的目录新建 .npmrc
添加 registry=https://registry.npmjs.com/
然后执行 npm publish
也不行,
执行 npm publish --registry=https://registry.npmjs.com/
也不行。
最终执行 npm config ls
发现端倪,原来在 npm 用户配置中设置了针对于某个 scope 的 registry,而这个配置项的生效优先级更高,删除该项配置后即可正确发布到期待的源。
执行 npm config ls
的结果如下:
1 | PS D:\workspace\SEM\epm-extend-core> npm config ls |
也可以仅执行 npm config get userconfig
或者 npm config get globalconfig
获取配置文件的位置
globalThis is not defined
globalThis 是 ES2020 引入的特性,globalThis 提供了一个标准的方式来获取不同环境下的全局 this 对象。例如在 Web 中,可以通过 window、self 或者 frames 取到全局对象,在 Web Workers 中,使用 self 。在 Node.js 中,使用 global。在某些环境中会报错 “globalThis is not defined” 通常是环境中没有 globalThis 变量。
- 在严格模式中
- 在模块环境下
- 环境不支持 通常是兼容性问题,例如在 Chrome < 71 的浏览器中并未支持 globalThis
unable to write symref for HEAD: Permission denied
在切换分支时报如此错误,通常是执行 git 命令的用户没有相应的权限
- 以管理员权限执行 git 命令或打开执行 git 命令的软件(例如SourceTree)
- 打开文件夹属性-安全,赋予用户相应的权限