在package.json
中直接修改了依赖版本号后执行npm i
可能会出现各种报错,比如Error: Cannot find module xxx
之类的。
这时候需要删除package-lock.json
并删除node_modules
目录后重新执行npm i
应该就可以恢复正常
在package.json
中直接修改了依赖版本号后执行npm i
可能会出现各种报错,比如Error: Cannot find module xxx
之类的。
这时候需要删除package-lock.json
并删除node_modules
目录后重新执行npm i
应该就可以恢复正常
express本身可以写async函数作为路由或者中间件(以下简称路由)使用,但如果在其中直接抛出异步错误的话则不会被捕获并传递给错误处理路由,需要在每一个async路由中手动写try/catch来捕获并处理错误,这显然对于拥有统一错误处理逻辑的框架是不友好的。
我不知道为什么express始终没有在4.x版本添加这个支持,看起来这应该并不会导致什么兼容性问题,即使不默认全局开启这个功能,也可以添加一个选项或开关函数来允许使用者开启异步错误捕获,但它始终没有这么做。
在这之前npm上也已经有一些可以实现这个功能的补丁包,不过它们几乎都是给创建出的app实例的所有相关路由方法套了一层壳在里面try/catch错误,导致如果是自己用一些特殊方法创建的路由对象,就失效了。
我原本用了一个直接修改express源码中相关原型方法的包,叫做
asyncPatch
函数需要传入一个创建出来的app实例, 为的是能获取到app所属的express包里的构造函数,不是为了在实例上包装方法。该函数在任何阶段调用都可以,只要在处理请求前调用即可。
用于在浏览器中下载文件,特性是支持断点续传(符合CORS规则时)、阻塞重连和失败重试,使用fetch流作为下载方式。
NPM: https://www.npmjs.com/package/@luojia/browser-filedownloader
GitHub: https://github.com/JiaJiaJiang/browser-FileDownloader
用于在页面上通过js附加样式表文本
用于在页面上的小图旁边显示一个大的浮动预览图
NPM: https://www.npmjs.com/package/floatingpreviewimg
GitHub: https://github.com/JiaJiaJiang/html-FloatingPreviewImg
此包封装了使用<datalist>标签为input提供输入建议的功能,仅需要提供一个获取建议数据的方法即可。
NPM: https://www.npmjs.com/package/inputadviser
GitHub: https://github.com/JiaJiaJiang/html-InputAdviser
每次换一个环境执行npm i都会碰到这样的问题,记录一下解决方法,
方法1:手动去报错的文件里指定编码为UTF-8,我自己第一次解决这个问题就是用的这个办法,刚刚想找找看有没有别的解决方法的时候发现别人也有去手动改源码的,放个参考链接。
简单地说就是找到报错的那行,给open函数加个encoding='utf-8'
参数就可以解决问题,但这样属于改了人家文件,更新后还是会变回去的,所以现在我不这样做了。
方法2:去控制面板的区域设置里到“管理”标签页下,“更改系统区域设置”,把“Beta版:使用Unicode UTF-8提供全球语言支持(U)”勾上,然后重启一下,python就会默认用utf-8来读文件了。
这个方法会改变整个系统的默认代码页,最主要的影响是会导致使用非Unicode的程序乱码甚至崩溃,还有在gbk设置时以ansi保存的含有中文的bat脚本会乱码。如果影响不大的话倒是可以让系统一直保持在这个区域选项上,影响某些软件的正常使用的话在执行完需要的编译任务后还得改回去。在这种模式下可以使用“locale emulator”这样的软件以Chinese模式启动程序,以解决程序的乱码和崩溃问题。
方法3:我没试过,理论上应该可行,从python本体入手,把它的默认编码设置成utf-8,参考这里的方案2。这个没用
npm的用户登录信息写在用户目录的.npmrc
文件里,所以同一时间只能登录一个账号,要切换账号的话就要重新用npm login
登录,比较麻烦。
于是写了个切换.npmrc文件来直接切换用户的shell脚本
分别login到对应的用户,然后查看用户目录里的.npmrc文件内容,复制出来,填到下面对应的地方
#!/bin/bash if [ $1 = "user1" ] then echo "user : $1"; echo -e "registry=http://registry.npmjs.org/\n//registry.npmjs.org/:_authToken=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" > ~/.npmrc; elif [ $1 = "user2" ] then echo "user : $1"; echo -e "registry=http://registry.npmjs.org/\n//registry.npmjs.org/:_authToken=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" > ~/.npmrc; fi
保存成比如npmuser
文件放在某个PATH目录里,然后用npmuser user1
这样的命令就可以直接切换用户而不用再登录了。
手动安装node的时候一不注意就会出现这个错误,装好了之后使用命令npm
测试一下出来了这个错误:Error: Cannot find module 'npmlog'
。
这一般是放在/bin里的链接不对导致的。
链接指向的不是node_modules/npm/bin/npm-cli.js
,初次手动安装难免会搞不清要链接哪个文件,把链接指向正确的位置即可。
使用的不是软链接,由于npm-cli.js中使用的是相对路径,要是你一不小心链了个硬链接,那么npm就会从/bin解析相对路径,所以就找不到npmlog模块了。要使用软链接,在ln命令后加上-s
选项:ln -s node_modules/npm/bin/npm-cli.js /bin/npm
刚刚我把SPDY装到全局,npm -g install spdy
,
spdy@2.0.4 /usr/local/lib/node_modules/spdy ├── http-deceiver@1.2.4 ├── handle-thing@1.2.4 ├── select-hose@2.0.0 ├── debug@2.2.0 (ms@0.7.1) └── spdy-transport@1.1.8 (obuf@1.1.1, wbuf@1.7.0, hpack.js@2.1.4, readable-stream@2.0.2)
可以看到这个模块被装到/usr/local/lib/node_modules里了
然后开个环境测试一下,结果
> require('spdy') Error: Cannot find module 'spdy' at Function.Module._resolveFilename (module.js:336:15) at Function.Module._load (module.js:286:25) at Module.require (module.js:365:17) at require (module.js:384:17) at repl:1:1 at REPLServer.defaultEval (repl.js:154:27) at bound (domain.js:254:14) at REPLServer.runBound [as eval] (domain.js:267:12) at REPLServer.<anonymous> (repl.js:308:12) at emitOne (events.js:77:13)
吓得我满脑子都是doge!!!这是为什么?