1.项目背景
meteor框架项目,用npm安装的usb包。
因为要用到usb的功能。
这里涉及一些硬件的连接,所以有node-gyp的过程。
2.报错原因
我用了npm install usb
命令来安装usb包,所以错了。
应该用meteor npm install usb
命令来安装usb包才对。
**区别:**应该是安装包的时候要结合meteor内部做了一些处理。所以要用meteor npm install usb
也可以简写成meteor npm i usb
3.报错内容
node-gyp(node-generate your project)我的报错如下
Error: The module ‘\?\D:\pratdemo\meteor_demo\meteor_upload_vue\node_modules\usb\build\Release\usb_bindings.node’
W20200401-09:34:06.239(8)? (STDERR) was compiled against a different Node.js version using
W20200401-09:34:06.241(8)? (STDERR) NODE_MODULE_VERSION 64. This version of Node.js requires
W20200401-09:34:06.241(8)? (STDERR) NODE_MODULE_VERSION 57. Please try re-compiling or re-installing
W20200401-09:34:06.242(8)? (STDERR) the module (for instance, using npm rebuild
or npm install
).
W20200401-09:34:06.244(8)? (STDERR) at Object.Module._extensions…node (module.js:682:18)
W20200401-09:34:06.245(8)? (STDERR) at Module.load (module.js:566:32)
W20200401-09:34:06.245(8)? (STDERR) at tryModuleLoad (module.js:506:12)
W20200401-09:34:06.246(8)? (STDERR) at Function.Module._load (module.js:498:3)
W20200401-09:34:06.247(8)? (STDERR) at Module.require (module.js:597:17)
W20200401-09:34:06.248(8)? (STDERR) at require (internal/module.js:11:18)
W20200401-09:34:06.249(8)? (STDERR) at bindings (D:\pratdemo\meteor_demo\meteor_upload_vue\node_modules\bindings\bindings.js:112:48)
W20200401-09:34:06.251(8)? (STDERR) at Object. (D:\pratdemo\meteor_demo\meteor_upload_vue\node_modules\usb\usb.js:1:57)
W20200401-09:34:06.252(8)? (STDERR) at Module._compile (module.js:653:30)
W20200401-09:34:06.259(8)? (STDERR) at Object.Module._extensions…js (module.js:664:10)
W20200401-09:34:06.261(8)? (STDERR) at Module.load (module.js:566:32)
W20200401-09:34:06.261(8)? (STDERR) at tryModuleLoad (module.js:506:12)
W20200401-09:34:06.262(8)? (STDERR) at Function.Module._load (module.js:498:3)
W20200401-09:34:06.263(8)? (STDERR) at Module.require (module.js:597:17)
W20200401-09:34:06.265(8)? (STDERR) at require (internal/module.js:11:18)
W20200401-09:34:06.269(8)? (STDERR) at npmRequire (D:\pratdemo\meteor_demo\meteor_upload_vue.meteor\local\build\programs\server\npm-require.js:133:10)
从报错的加粗内容中可以看到,该usb包在当前环境要求的是NODE_MODULE_VERSION 57这版本的包,而我安装的却是NODE_MODULE_VERSION 64所以错了。
4.解决办法
1.首先通过npm uninstall usb
卸载usb包,或者你也可以在node_modules里面找到usb文件夹整个删除。
2.然后通过meteor npm install usb
安装usb包,就正常了。这是官方推荐的安装方式。
温馨提示:该npm的usb包一定要通过meteor的server端引入和使用,然后通过前端触发server端的方法就好,前端触发server端的方法用到meteor的包cfs:http-methods
可以去这里搜索https://atmospherejs.com/?q=cfs%3Ahttp-methods。
npm的usb包在前端client直接引入会报错的。除非你前端用nwjs引入也可能行。
5.总结
1.都怪自己自以为是:自以为npm i usb
和meteor npm i usb
安装方式会是一样的效果。好像运行的时候,也能安装上usb包啊。但是会有微小的差别
如果该npm包只是前端的功能的,例如vue包,其实这两个安装方式应该都可以。
但如果涉及到后台或者硬件方面,就只能用meteor npm i usb
来安装了。因为usb包涉及到了硬件方面功能。(电脑usb接口)
2.npm的包,尽量在后台server端引入和使用。
var usb = require('usb')
3.npm的包,涉及到硬件方面的话,不要在前端引入,会报dll找不到的错误,如Error: A dynamic link library (DLL) initialization routine failed.
bindings.node报错
好吧,关于meteor使用的心得,希望大家多多交流。
如有不懂,欢迎评论!